什么是造成内存泄漏?
问题描述:
什么导致此代码泄漏?我真的无法理解它。 在行上: 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 //克里斯托弗
答
检查并确保释放了dic。您应该在您认为最终版本的位置之前将NSLog保留计数,并确保它们在最终版本发布之前为1。
另外,运行构建和分析以确保您正确释放。内置的构建和分析并没有像运行扫描构建一样发现许多泄漏,因此请考虑将扫描构建安装到Xcode中。
Using an external Xcode Clang Static Analyzer binary, with additional checks
答
您是否尝试过的,如果内改变的变量的NSMutableArray *天的名字吗?你不是因为这个而发出警告吗?
答
有什么不妥特定的代码(不是几天在内部范围稍微可疑重定义等)。你保留的其他地方,但忘记释放你放在字典中的对象。
答
您应该收到关于重新申报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];
}
答
变化NSMutableArray的初始化...
NSMutableArray * days = [NSMutableArray array];
忘掉保留计数。它最好是误导。您应该使用Apple内存管理调试工具和静态分析器来检测泄漏的原因。 – JeremyP 2010-08-26 14:14:29
你为什么认为retainCount有误导性?在某些时候,在调试的时候,如果你检查你认为最终版本是什么(你经常有一个好主意) - retainCount应该在它之前。如果没有,你可能已经忘记了其他地方的发布。 – 2010-08-26 14:52:15