【问题标题】:Why does one of these methods cause a leak and the other not为什么其中一种方法会导致泄漏而另一种不会
【发布时间】:2011-06-06 06:32:01
【问题描述】:

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

第一

-(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. 方法返回一个具有 +1 保留计数(拥有引用)的 Objective-C 对象

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

有什么区别?

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    在第一种情况下,分析器希望您在类的 - (void)dealloc 方法中释放您初始化的 result 字符串。如果您不这样做 - 您也会遇到泄漏(如果您使用添加了 Leaks 工具的 via Instruments 应用程序运行您的应用程序,您会看到泄漏。

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

    【讨论】:

      【解决方案2】:

      不同的是,全局String变量仍然指向包含对象的内存位置,而局部变量超出了作用域,所以没有指针了,内存也没有被释放。

      也就是说,人们必须明白,即使在技术上不是泄漏的情况下,也可能被视为泄漏,特别是如果人们不打算使用全局变量而只是在应用程序的生命周期内保存引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        • 2019-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        相关资源
        最近更新 更多