2009-10-30 64 views
10

我正在閱讀關於編碼和解碼的內容,並且我注意到有時候人們會錯過保留,我也注意到保留有時用在一些可變參數上,而不是其他的。我可以問...在initWithCoder中使用retain?

(1)這種保留的目的是什麼?爲什麼有時候不需要?

(2)使用保留是否意味着我需要將它與發佈相匹配,並且如果是這樣的話?

- (id) initWithCoder: (NSCoder *) decoder { 
    name = [[decoder decodeObjectForKey: @"CardName"] retain]; 
    email = [[decoder decodeObjectForKey: @"CardEmail"] retain]; 
} 

- (id) initWithCoder: (NSCoder *) decoder { 
    name = [decoder decodeObjectForKey: @"CardName"]; 
    email = [decoder decodeObjectForKey: @"CardEmail"]; 
} 

加里

+0

最有可能的是,您看到的沒有明確保留解碼對象的代碼示例使用setter方法聲明所有權。 – Chuck

回答

12

你的第一個SNIPPIT代表正確的行爲。 -decodeObjectForKey:方法不包含單詞init,copynew,因此沒有承諾返回的對象是否會留在那裏,如果有的話多久。如果你的對象需要它的ivars留下來,它應該從解碼器獲得的對象。這個-retain將需要平衡一個-release,這將在你的對象的-dealloc方法(所以這個對象是用它保留的一些初始的ivars創建的,並且當它被銷燬時釋放它的ivars)。就像這樣:

- (void)dealloc { 
    [name release]; 
    [email release]; 
    [super dealloc]; 
} 

的保留/釋放不需要舞蹈:

  • 如果你正在使用的垃圾收集

  • ,如果你的對象並不需要要求的所有權的高德。情況並非常見;代表通常不會保留(但通常不會被歸檔),並且使用assign修飾符聲明的屬性也不是。

+0

我可能需要另一輪內存管理指南,我可以問,如果我分配一個包含單個NSString實例變量的簡單類,我應該釋放它在我的dealloc或釋放包含的實例時會釋放? – fuzzygoat

+0

是的,當它被設置時你應該保留實例變量,並在不再需要時釋放它。我有一篇關於內存管理文章鏈接的博客文章:http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html – 2009-10-30 15:09:56

+0

謝謝格雷厄姆,我想我現在到了那裏,我已經將您的博客文章鏈接以供將來參考。週末愉快。 – fuzzygoat

9

您可能也已通過使用性能以及人誤導。它可能是你見過的人做的:

- (id) initWithCoder: (NSCoder *) decoder { 
    self.name = [decoder decodeObjectForKey: @"CardName"]; 
    self.email = [decoder decodeObjectForKey: @"CardEmail"]; 
} 

如果姓名和電子郵件被定義爲「保留」特性,這將被罰款。當然,然後你會進入關於在初始化/ dealloc方法中使用屬性訪問器的合法/可行的論點 - 有人說是,有些人說不,蘋果似乎在no方面,但從未真正給過我可以看到的很好的理由。

相關問題