2011-09-01 44 views
0

我實現了一種方法來返回我的應用程序中的字典。但是我發現使用樂器存在內存泄漏,我試圖找出它,但我仍然無法找到它。誰能幫我嗎?提前NSDictionary內存泄漏

謝謝你,這裏是該方法的代碼:

-(NSMutableDictionary *)initDict 
{ 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc]init]; 
    [dict setObject:self.name forKey:@"Name"]; 
    //Some similar set object for key here... 
    return dict; 
} 

我認爲這個問題是從allocing的字典存儲和不釋放它。但在該方法中,似乎我無法釋放字典。那麼是否有任何方法來解決泄漏問題?

回答

2

所有變種都很好。這是第三個變種(明智的選擇):

更換

NSMutableDictionary *dict = [[NSMutableDictionary alloc]init]; 

NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
+0

'dictionary]'是'init] autorelease]的同義詞;你應該在明確的'autorelease'調用之上使用這個版本,因爲該對象是在它返回的/ autoreleased的相同範圍內創建的,這是'dictionary]'initialiser(臨時對象)的預期用例。 – darvids0n

+0

你已經解決了我的最後50個內存泄漏,謝謝。我從來不知道這一點,我非常感謝你。我認爲這需要提高很多。 – Rob

1

我想你只需要改變的initDict這最後一行:

return [dict autorelease]; 
+0

+1如果對象是在同一範圍內初始化,但在'返回之前在其他地方通過,這是有用'聲明,並且存在''漏''NSAutoreleasePool'中的危險,從而將其解除分配。這*不應該成爲問題,因爲自動釋放池被堆疊起來以避免這種釋放問題,但是現在可能有一個邊緣情況,現在我不能想到你必須確保它正確地被「保留」。 – darvids0n

0

當你創建你的函數的任何對象,並要回報他們,那麼你應該總是以一種方式創建那些對象是自動釋放的。所以你應該像下面那樣改變你的代碼。

NSMutableDictionary *dict = [[[NSMutableDictionary alloc]init]autorelease]; 

因此,無論何時創建任何對象,只需調用autorelease方法即可。