什么导致内存泄漏?

时间:2010-08-26 13:54:35

标签: iphone objective-c memory-management memory-leaks

导致此代码泄漏的原因是什么?我实在无法理解。 在线: 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 //克里斯托弗

5 个答案:

答案 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];