2010-08-26 98 views
3

什麼導致此代碼泄漏?我真的無法理解它。 在行上: 1:NSMutableArray * days = [[NSMutableArray alloc] init]; 2:[dic setObject:days forKey:key]; 3:[days addObject:value];什麼是造成內存泄漏?

整個方法:

-(void) addValueToDictionary: (NSMutableDictionary *) dic withValue: (NSNumber *) value forKey: (NSString *) key { 
NSMutableArray * days = [dic objectForKey:key]; 
if (days == nil) { 
    NSMutableArray * days = [[NSMutableArray alloc]init]; 
    [days addObject:value]; 
    [dic setObject:days forKey:key]; 
    [days release]; 
    days = nil; 
} 
else { 
    [days addObject:value]; 
} 

}

BR //克里斯托弗

回答

1

檢查並確保釋放了dic。您應該在您認爲最終版本的位置之前將NSLog保留計數,並確保它們在最終版本發佈之前爲1。

另外,運行構建和分析以確保您正確釋放。內置的構建和分析並沒有像運行掃描構建一樣發現許多泄漏,因此請考慮將掃描構建安裝到Xcode中。

Using an external Xcode Clang Static Analyzer binary, with additional checks

+0

忘掉保留計數。它最好是誤導。您應該使用Apple內存管理調試工具和靜態分析器來檢測泄漏的原因。 – JeremyP 2010-08-26 14:14:29

+1

你爲什麼認爲retainCount有誤導性?在某些時候,在調試的時候,如果你檢查你認爲最終版本是什麼(你經常有一個好主意) - retainCount應該在它之前。如果沒有,你可能已經忘記了其他地方的發佈。 – 2010-08-26 14:52:15

0

您是否嘗試過的,如果內改變的變量的NSMutableArray *天的名字嗎?你不是因爲這個而發出警告嗎?

0

有什麼不妥特定的代碼(不是幾天在內部範圍稍微可疑重定義等)。你保留的其他地方,但忘記釋放你放在字典中的對象。

1

您應該收到關於重新申報days的警告。如果您使用靜態分析儀,這可能會導致泄漏檢查。下面修改方法。大多數編碼風格隨着一些防守編碼的增加而改變。

-(void) addValueToDictionary: (NSMutableDictionary *) dic withValue: (NSNumber *) value forKey: (NSString *) key 
{ 
    if (nil == dic || nil == key || nil == value) return; // bail out on nil parameters 
    if (![dic objectForKey:key]) { 
     NSMutableArray * days = [[NSMutableArray alloc] init]; 
     [dic setObject:days forKey:key]; 
     [days release]; 
    } 
    [[dic objectForKey:key] addObject:value]; 
} 
0

變化NSMutableArray的初始化...

NSMutableArray * days = [NSMutableArray array];