【问题标题】:Objective-C NSString's memory management [duplicate]Objective-C NSString的内存管理[重复]
【发布时间】:2012-05-11 16:11:21
【问题描述】:

可能重复:
Local variable assign versus direct assign; properties and memory
Which way is the correct way to allocate memory with a property?

我想知道这两个代码示例之间的区别。

1:

NSString *someString = @"Blabla";


{...Some code...}


imageView.title = [[NSString alloc] initWithString:someString];

2:

NSString *someString = @"Blabla";


{...Some code...}


NSString *str = [[NSString alloc] initWithString:someString];
imageView.title = str;
[str release];

由于某种原因,Xcode Analyzer 警告我选项 #1 可能会导致内存泄漏 - 所以当我将代码更改为选项 #2 时,分析器不会警告我。

有人知道这是什么原因吗?

非常感谢!

【问题讨论】:

标签: objective-c memory-management


【解决方案1】:

假设你没有使用 ARC,

[str release];

line 是这里的关键。将该行添加到第一个示例 sn-p 的末尾,看看您是否收到相同的警告。在对象上显式调用 alloc 会增加引用计数 - 为了减少引用计数,应该调用 release

有关 ARC 的信息,请参阅:How does the new automatic reference counting mechanism work?

【讨论】:

    【解决方案2】:

    在第一个示例中,您分配了一个新的 NSString,将其传递,但​​没有释放它。您有责任释放该字符串,该字符串在您首次分配时具有 +1 保留计数。

    (忽略您的简单示例可能不会导致实际泄漏的事实。但这不是重点,这里仍然不是管理该内存的正确方法)

    【讨论】:

      【解决方案3】:

      第一个示例中的问题:

      NSString *someString = @"Blabla";
      {...Some code...}
      imageView.title = [[NSString alloc] initWithString:someString];
      

      是您正在通过 alloc/init 分配一个字符串并将其分配给imageView.title 这是一个retain 属性。事实上,alloc 会给你一个保留计数为 1 的对象;将其分配给 retain 属性也将增加其保留计数 (2)。现在,当 imageView 最终被释放时,它的 dealloc 方法将释放 title 属性(因此将其保留计数减 1),但对象不会被释放,因为您没有机会再次调用 release平衡你自己的alloc

      这里要注意的重要一点是,您正在分配一个retain 属性;如果 title 不是保留属性,您的代码就可以了。

      这是您修复第一个示例的方法:

      imageView.title = [[[NSString alloc] initWithString:someString] autorelease];
      

      imageView.title = [NSString stringWithString:someString];
      

      它依赖于使用商品构造函数,按照惯例为您提供一个自动释放的对象。

      (您在第二个示例中的操作方式也是正确的,虽然稍微冗长一些)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-12
        • 1970-01-01
        • 2014-01-03
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多