什么导致内存泄漏?

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 //Christoffer

5个回答

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];
}

1

检查确保dic已被释放。在你认为最终释放的位置之前,应该NSLog retainCount,并确保它们在最终释放之前为1。

此外,运行Build and Analyze以确保你正在正确释放。内置的Build and Analyze不能像运行带有所有检查的scan-build那样找到许多泄漏问题,因此请考虑将scan-build安装到Xcode中。

使用外部Xcode Clang静态分析器二进制文件,具有额外的检查


忘掉保留计数吧,它最多只会让你产生误导。你应该使用苹果的内存管理调试工具和静态分析器来检测泄漏的原因。 - JeremyP
1
你为什么认为retainCount是误导性的?在调试时,如果你检查你认为的最终释放点(通常你有一个很好的想法)-- retainCount应该在此之前为1。如果不是,你可能忘记了其他地方的释放。 - Lou Franco

0

将NSMutableArray的初始化更改为...

NSMutableArray * days = [NSMutableArray array];

0

你尝试过在if语句内更改变量NSMutableArray *days的名称吗?这样做不会因为警告而出现问题吗?


0

那个特定代码片段没有问题(除了在内部作用域中稍微值得怀疑的重新定义 days)。在别处,您保留了但忘记释放放入字典的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接