簡體   English   中英

可可為什么我必須保留並釋放功能參數?

[英]Cocoa why do I have to retain and release a function parameter?

我正在研究Aaron Hillegass的書,特別是彩票示例。 我對-setEntryDate:方法有疑問; 為什么我必須保留date 該程序仍然可以正常工作,而無需保留它。

 -(void)setEntryDate:(NSCalendarDate *)date {
    [date retain];
    [entryDate release];
    entryDate = date;
}

但這仍然可以正常工作:

-(void)setEntryDate:(NSCalendarDate *)date {
    entryDate = date;
}

那么為什么必須保留date然后釋放entryDate是正確的呢?

它現在可以使用,但是如果您正在編寫一個更大的程序,則有可能在將來某個不確定的時刻,對象date指向的位置將由稱為setEntryDate的任何人釋放。 如果發生這種情況,它將在整個程序的其余部分失效。 您將該對象保留在類中,因為該類現在擁有對該對象的引用並需要指出。 這樣,即使任何名為setEntryDate類都將發布date ,您的類仍將保持對其的有效引用。 另外,這不僅是您正在編寫的常規舊方法。 這是一個setter,它專門負責在它所屬的類上設置一個實例變量。 如果編寫的是非設置方法,則可能不必保留參數。 我要說的是,保留方法參數並不總是必需的。 就是在這種情況下(幾乎所有處理非原始類型的設置器)。

這稱為“參考計數”,在此進行詳細說明。 現在,由於您才剛剛開始學習,所以不必擔心閱讀。 當您開始使用內存管理進入更復雜的場景時,該指南是非常有價值的閱讀材料。

因為您聲明了對象的所有權,所以retain是您執行此操作的方式。 錯誤的代碼有時會碰巧正常工作,但這本質上只是運氣。

請參閱可可內存管理規則

諸如此類的方法稱為訪問器方法 顧名思義,它們允許檢索和設置變量-具體來說,它們稱為“獲取器”和“設置器”。

約定(不過,您將在本書的后續章節中看到的約定不只是約定)是為變量(例如,名為fooNSString )調用“ getter”

- (NSString*)foo;

和“設定者”:

- (void)setFoo:(NSString*)newFoo;

在上面的示例中,該方法實現為設置新的日期值。 內存管理在第4章中進行了描述,但簡而言之,Objective-C對象的工作方式是它們具有“保留計數”-這表示該對象具有的引用數; 分配后,對象的保留計數為1。然后可以向對象發送retainrelease消息以分別增加或減少保留計數。 retain消息表示發送該消息的對象要使用該對象,因此retain它。 release消息意味着發送消息的對象不再希望使用該對象,因此減少了保留計數。 當對象的保留計數達到0時,將釋放該對象。 這樣,避免了內存泄漏。

保留date並釋放entryDate的原因是,該date是您要“了解”的新對象; 因此,您要通過retain所有權來主張所有權。 entryDate變量指向當前日期對象,但是由於您將其設置為新值,因此您不再需要了解它。 因此,您release它; 這可以防止內存泄漏,因為您最初將保留此變量。

正如我之前所說,一旦閱讀了第4章:內存管理 ,這個概念就會變得更加清晰。 現在,只接受它並在解釋它時了解其背后的原因。

如果您通過視頻學習得更好,則斯坦福大學已經在iPhone開發中發布了一些視頻,這些視頻在一定程度上也涵蓋了Cocoa和Objective-C。 查看第3課,它通過示例和討論很好地概述了內存管理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM