objective-c - 使用 ARC 时是否在 dealloc 中将属性设置为 nil?

标签 objective-c ios automatic-ref-counting

我正在尝试学习 iOS 5 中的自动引用计数。现在这个问题的第一部分应该很简单:

  1. 我确实需要写明确的吗? 使用 ARC 时我的 dealloc 中的 release-property 语句?其他 话,以下是真的 NOT 需要明确 解除分配?

    @interface MyClass : NSObject
    @property (strong, nonatomic) NSObject* myProperty;
    @end
    
    @implementation MyClass
    @synthesize myProperty;
    @end
    
  2. 我的下一个更重要的问题来自 Transitioning to ARC Release Notes 中的一行。文件:

    You do not have to (indeed cannot) release instance variables, but you may need to invoke [self setDelegate:nil] on system classes and other code that isn’t compiled using ARC.

    这就引出了一个问题:我怎么知道哪些系统类不是用 ARC 编译的?我什么时候应该创建自己的 dealloc 并将强保留属性显式设置为 nil?我是否应该假设属性中使用的所有 NS 和 UI 框架类都需要显式释放?

在 SO 和其他地方有大量关于在使用手动引用跟踪时释放属性的支持 ivar 的做法的信息,但在使用 ARC 时这方面的信息相对较少。

最佳答案

简答:不,您不必在 ARC 下的 dealloc 中清除属性。

长答案:您不应该在 dealloc 中清除属性,即使在手动内存管理中也是如此。

在 MRR 中,您应该发布您的 ivars。取消属性意味着调用 setter,这可能会调用它不应该在 dealloc 中触及的代码(例如,如果您的类或子类覆盖了 setter)。同样,它可能会触发 KVO 通知。释放 ivar 可以避免这些不良行为。

在 ARC 中,系统会自动为您释放任何 ivars,因此如果您只这样做,您甚至不必实现 dealloc。但是,如果您有任何需要特殊处理的非对象 ivars(例如,您需要 free() 分配的缓冲区),您仍然需要处理 dealloc 中的那些。

此外,如果您将自己设置为任何对象的委托(delegate),您应该在 dealloc 中取消设置该关系(这是关于调用 [obj setDelegate:nil] )。关于在未使用 ARC 编译的类上执行此操作的说明是对弱属性的一种认可。如果该类明确地将其 delegate 属性标记为 weak 那么您不必这样做,因为弱属性的性质意味着它将为您取消。但是,如果该属性被标记为 assign,那么您应该在您的 dealloc 中将其取消,否则该类会留下一个悬空指针,并且如果它尝试向其发送消息,则可能会崩溃代表。请注意,这仅适用于非保留关系,例如委托(delegate)。

关于objective-c - 使用 ARC 时是否在 dealloc 中将属性设置为 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7906804/

相关文章:

iphone - 如何使 UINavigationBar 不下推 View ?

ios - 在collectionView中加载图像

iphone - Objective-C 中的长轮询

java - 将 iOS 应用程序转换为 Android 应用程序

ios - 基于现有文件创建新的 Xcode 项目。 (在 NSTimer 中创建圈数)

objective-c - 应用程序不释放内存,内存使用量每次都会增加一倍

objective-c - 似乎无法使用 ARC 从 NSString* 转换为 CFString*

ios - UITextField 上的键盘关闭但无法单击其他 UITextField

ios - Swift Spritekit 计数触摸

ios - 为什么我不能给无主常量一个初始值?