使用ARC时,是否将属性设置为dealloc?

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

  1. 使用ARC时,我不需要在dealloc中写明确的释放属性语句,这是否正确? 换句话说,以下是不是需要一个明确的dealloc?

    @interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end 
  2. 我的下一个更重要的问题来自“ 转换到ARC版本说明”文档中的一行:

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

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

在使用手动参考跟踪的时候,有很多关于SO和其他地方关于释放财产支持ivar的做法的信息,但是在使用ARC时相对较less。

简单的回答 :不,你不需要在ARC下的dealloc删除属性。

长的答案 :即使在手动内存pipe理中,也不应该删除dealloc属性。

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

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

而且,如果你已经把自己设置为任何对象的委托,你应该在dealloc取消这个关系(这是关于调用[obj setDelegate:nil] )。 关于如何在没有使用ARC编译的类上进行这个操作的注意事项是对弱性质的点头。 如果类明确地将其delegate属性标记为weak那么您不必这样做,因为弱属性的性质意味着它将会被replace掉。 但是,如果该属性被标记为assign那么你应该在你的dealloc删除它,否则这个类会留下一个悬挂的指针,并且如果它尝试发送它的委托,可能会崩溃。 请注意,这仅适用于非保留关系,例如代表。

只是给出相反的答案…

简单的回答 :不,你不必在ARC下的dealloc自动合成属性。 你不需要在init使用setter。

长的答案 :你应该dealloc删除自定义合成的属性,即使在ARC下也是如此。 而且你应该在init使用setter。

关键是你的自定义综合属性应该是安全和对称的关于废除。

定时器的一个可能的setter:

 -(void)setTimer:(NSTimer *)timer { if (timer == _timer) return; [timer retain]; [_timer invalidate]; [_timer release]; _timer = timer; [_timer fire]; } 

一个可能的setter为scrollview,tableview,webview,textfield,…:

 -(void)setScrollView:(UIScrollView *)scrollView { if (scrollView == _scrollView) return; [scrollView retain]; [_scrollView setDelegate:nil]; [_scrollView release]; _scrollView = scrollView; [_scrollView setDelegate:self]; } 

KVO物业的可能筹备者:

 -(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]; } 

那么你不必重复任何代码deallocdidReceiveMemoryWarningviewDidUnload ,…你的财产可以安全地公开。 如果你担心无法使用dealloc属性,那么你可能会再次检查你的setter。