导致此代码泄漏的原因是什么?我实在无法理解。 在线: 1:NSMutableArray * days = [[NSMutableArray alloc] init]; 2:[dic setObject:days forKey:key]; 3:[天addObject:值];
整个方法:
-(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 //克里斯托弗
答案 0 :(得分:1)
检查以确保已释放dic。在您认为最终版本发布之前,您应该使用NSLog retainCount,并确保在最终版本发布之前它们是1。
此外,运行Build and Analyze以确保正确释放。内置的Build and Analyze没有找到与使用所有检查运行scan-build一样多的泄漏,因此请考虑将scan-build安装到Xcode中。
Using an external Xcode Clang Static Analyzer binary, with additional checks
答案 1 :(得分: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];
}
答案 2 :(得分:0)
您是否尝试在if中更改变量NSMutableArray *天的名称?你不是因为这个而得到警告吗?
答案 3 :(得分:0)
这段特定的代码没有任何问题(除了内部范围内对天的重新定义略有疑问)。你保留的其他地方但忘记释放放在字典中的对象。
答案 4 :(得分:0)
将NSMutableArray初始化更改为...
NSMutableArray * days = [NSMutableArray array];