2012-02-20 30 views
0

我有一個奇怪的情況,我希望有人可以闡明一些。我在自定義對象中實現了NSCoding協議,並且我在initWithCoder:中遇到了內存泄漏。我有這樣的事情:在使用decodeObjectForKey時使retainCounts有意義:

NSString* titleTemp = [aDecoder decodeObjectForKey:@"title"]; 
if(titleTemp) { 
    [self setTitleString:titleTemp]; 
} else { 
    [self setTitleString:[NSString string]]; 
} 

我有很多的這個對象的其他屬性,有些是數組,一些字符串,以及一些原語(雙打,整數),而我一直獲得內存泄漏此方法。儀器告訴我在decodeObjectForKey:行上的每次解碼都會發生泄漏。當您泄漏每個自定義類中的每個單個解碼對象的數量超過10個對象時,內存開始累加。

但真正難倒我是這個代碼的輸出:

NSString* titleTemp = [aDecoder decodeObjectForKey:@"title"]; 
NSLog(@"%i", titleTemp.retainCount); 

是 「3」!

Woah,這些都是從哪裏來的?打敗我。但我很想知道所有這些泄漏。謝謝!

回答

2

哇哇,這些都是從哪裏來的?

很難說如果你看不到代碼保留,但只要它不是你的代碼,那麼你不應該擔心它。 -decodeObjectForKey:實際上很可能會調用其他幾種方法來創建字符串,並且這些方法中的任何一個都可能保留並隨後自動釋放該字符串。

打我。但我很想知道所有這些泄漏。

而不是試圖使用-retainCount來查找泄漏,看看泄漏的對象。儀器可以幫助你做到這一點。確保你平衡了這些對象的保留(以及當然是分配,複製和新建)和發佈。如果您過度保留或釋放物體,會導致泄漏。如果您的控制之外的某些代碼正在執行此操作,則無論如何您都無法做到這一點。

+0

在重新閱讀類似問題的一些答案時,我意識到我並沒有在'dealloc'(duh!)中釋放所有'retain'屬性。所以你是對的 - 我只是沒有平衡我的保留/釋放。我應該睡覺了。謝謝你的時間。 – 2012-02-20 06:05:55

2

閱讀:http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/。他是對的。這意味着你需要遵循Cocoa的內存管理規則,而忽略由retainCount返回的值。請確保您擁有的每個對象releaseautorelease,或者是因爲您保留了它,或者是因爲您從init,new,copymutableCopy開始的方法得到它。此外,您的版本/ autoreleases需要與您擁有的參考資料進行平衡。所以,如果你保留一個對象,你只能釋放一次。

在這個你的具體情況下,這個問題似乎並不在你發佈的小片段中。但重要的一點是,你不應該使用retainCount進行調試。

+0

我只是好奇,爲什麼一個對象會返回一個高的保留計數 – 2012-02-20 06:06:57

+0

很難說清楚爲什麼,但這可能是因爲系統框架在你保留對象之前多次保留它。 – 2012-02-20 06:35:04