【问题标题】:Why should we release?我们为什么要释放?
【发布时间】:2010-12-18 04:14:51
【问题描述】:

我经常看到当我们释放 ab 对象时,我们立即将它设置为 nil。我知道 release 和 nil 都释放了与 object 关联的旧值,但在 release 的情况下,它会将对象作为悬空指针,因此我们必须将其设置为 nil。

所以我的问题是如果 nil 释放对象的旧值并将对象设置为 nil 为什么我们不应该只使用 nil 为什么 w 也应该使用 release。

方式1:

MyClass *obj = [[MyClass alloc] init];
[obj release];
obj = nil;

方式2:

MyClass *obj = [[MyClass alloc] init];
obj = nil;

如果使用way1 为什么不只使用way2,那么way1 和way2 的真正区别是什么?

【问题讨论】:

    标签: iphone cocoa-touch xcode memory-management


    【解决方案1】:

    将指针设置为 nil 不会释放该指针之前的目标所占用的内存。简单来说,将它分配给 nil 并不会 释放它。

    如果您的应用程序被垃圾收集,则释放是无操作的,可以省略。否则,这是非常非常必要的。因此,方式一总是正确的,方式二只有在垃圾回收下才是正确的。

    注意:此答案不适用于使用自动引用计数的项目。在 ARC 下,将指针设置为 nil确实向对象发送释放。

    【讨论】:

    • 这里有一个明显的例外:如果它是一个实例变量并且它已被声明为@property (retain) 并且 你有@synthesized 访问器,那么这些访问器方法将负责保留和释放你分配给它们的对象。当然,这仅在您使用访问器方法时才有效:[self setObj:nil]self.obj = nil(在 objc-2.0 中)。
    【解决方案2】:

    正如 BJ 所说,将其设置为 nil 不会释放内存,并且在非 gc 收集的环境中会导致内存泄漏。一个可能也有效的替代方法是

    MyClass *obj = [[[MyClass alloc] init] autorelease];  
    
    obj = nil;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-19
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 2017-02-26
      相关资源
      最近更新 更多