2010-04-22 242 views
0

如何簡潔地處理這種情況。在if聲明,我無法正常釋放contactDictionary ...Release Quickie

NSNumber *pIDAsNumber; 
    ...   
    NSMutableDictionary *contactDictionary = [NSMutableDictionary dictionaryWithDictionary:[defaults dictionaryForKey:kContactDictionary]]; 
    if (!contactDictionary) { 
      contactDictionary = [[NSMutableDictionary alloc] initWithCapacity:1]; 
    } 
    [contactDictionary setObject:pIDAsNumber forKey:[myClass.personIDAsNumber stringValue]]; 
    [defaults setObject:contactDictionary forKey:kContactDictionary]; 

回答

3

通常情況下,使用[NSMutableDictionary dictionaryWithCapacity:1]而不是分配/初始化。這會給你一個自動釋放的字典,從內存管理的角度來看,它的行爲與上面的一樣。然而...

在這個特定的情況下,你的if子句永遠不會是真的(除非你內存不足,在這種情況下你有更大的問題)。 -dictionaryWithDictionary:返回空字典,而不是零,如果它通過零。所以,即使-dictionaryForKey:返回零,-dictionaryWithDictionary:仍然會創建一個空的可變字典供您添加。

+1

是的。相反,你應該使用'[[defaults dictionaryForKey:kContactDictionary] mutableCopy]'。 – 2010-04-22 23:46:52

+1

感謝參數爲零時的行爲信息 - 它不在文檔中! – 2012-03-06 02:28:33

0

您可以完全刪除if語句,因爲-[NSMutableDictionary dictionaryWithDictionary:]總是返回一個字典。

此外,不要使用[NSMutableDictionary dictionaryWithCapacity:1]來獲得一個空的,自動發佈的可變字典。只需使用[NSMutableDictionary dictionary]