使用ARC时,我是否在dealloc中将属性设置为nil?

时间:2011-10-26 17:58:40

标签: objective-c ios automatic-ref-counting

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

  1. 我做 NOT 是否需要明确写明是否正确 使用ARC时,我的dealloc中的release-property语句?其他 是的,以下 NOT 是否需要明确 的dealloc?

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

      

    您不必(实际上不能)释放实例变量,但您可能需要在系统类和其他未使用ARC编译的代码上调用[self setDelegate:nil]。

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

  3. 在使用手动参考追踪时,有关SO和其他地方有关释放财产支持ivar的做法的大量信息,但使用ARC时相对较少。

2 个答案:

答案 0 :(得分:197)

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

长答案:即使在手动内存管理中,也不应该忽略dealloc中的属性。

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

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

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

答案 1 :(得分:1)

只是给出相反的答案......

简短回答:不,您不必在ARC下的dealloc中自动合成属性。而且您不必在init

中使用setter

长答案:即使在ARC下, 也应该<{1}}中的自定义合成属性。你应该在dealloc

中使用setter

重点是你的自定义合成属性在无效方面应该是安全和对称的。

计时器的可能设定器:

init

滚动视图,tableview,webview,textfield,...的可能设置器:

-(void)setTimer:(NSTimer *)timer
{
    if (timer == _timer)
        return;

    [timer retain];
    [_timer invalidate];
    [_timer release];
    _timer = timer;
    [_timer fire];
}

KVO属性的可能设置器:

-(void)setScrollView:(UIScrollView *)scrollView
{
    if (scrollView == _scrollView)
        return;

    [scrollView retain];
    [_scrollView setDelegate:nil];
    [_scrollView release];
    _scrollView = scrollView;
    [_scrollView setDelegate:self];
}

然后,您无需复制-(void)setButton:(UIButton *)button { if (button == _button) return; [button retain]; [_button removeObserver:self forKeyPath:@"tintColor"]; [_button release]; _button = button; [_button addObserver:self forKeyPath:@"tintColor" options:(NSKeyValueObservingOptions)0 context:NULL]; } deallocdidReceiveMemoryWarning,...的任何代码,您的财产可以安全公开。如果您担心viewDidUnload中的属性为nil,那么您可能需要再次检查您的安装人员。