为什么这些方法中的一个导致泄漏而另一个不导致泄漏

时间:2011-06-06 06:32:02

标签: iphone objective-c memory-management

在我的应用程序中,我的内存泄漏

首先

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {  
    result = [[NSString alloc] initWithBytes:[webData mutableBytes]
                                      length:[webData length]
                                    encoding:NSUTF8StringEncoding];  
    [webData release];  
}

第二次

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {  
    NSString * result = [[NSString alloc] initWithBytes:[webData mutableBytes]
                                                 length:[webData length]
                                               encoding:NSUTF8StringEncoding];
    [webData release];
}

在我的第一个进程中我没有得到内存泄漏(全局声明一个字符串对象而我没有释放它)

在我的第二个进程中,我在字符串对象中出现内存泄漏。

  1. 永远不会读取在初始化期间存储到'结果'的值

  2. Method返回一个带有+1保留计数的Objective-C对象(拥有引用)

  3. 在第124行分配并存储到'result'中的对象在此点之后不再被引用,并且保留计数为+1(对象泄露)

  4. 有什么区别?

2 个答案:

答案 0 :(得分:3)

在第一种情况下,分析器希望您在类的result方法中释放初始- (void)dealloc字符串。如果你不这样做 - 你也会得到泄漏(如果你通过仪器应用程序运行你的应用程序并添加了泄漏仪器,你会看到泄漏。

在第二种情况下,你在方法范围内创建一个局部变量,它也应该被释放,因为你不会在任何其他方法中引用它(即如果你尝试访问result变量其他方法你会得到未知标识符错误。)

答案 1 :(得分:1)

不同之处在于全局String变量仍指向包含该对象的内存位置,而本地变量超出范围,因此不再有指针且内存尚未释放。

那就是说,人们必须明白,即使在技术上不泄漏的情况也可以这样看,特别是如果一个人不打算使用全局变量并只保留应用程序生命周期的引用。