2010-08-26 192 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];