使用ARC时,是否将属性设置为dealloc?
我正在尝试在iOS 5中学习自动引用计数。现在这个问题的第一部分应该很简单:
-
使用ARC时,我不需要在dealloc中写明确的释放属性语句,这是否正确? 换句话说,以下是不是需要一个明确的dealloc?
@interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end
-
我的下一个更重要的问题来自“ 转换到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]; }
那么你不必重复任何代码dealloc
, didReceiveMemoryWarning
, viewDidUnload
,…你的财产可以安全地公开。 如果你担心无法使用dealloc
属性,那么你可能会再次检查你的setter。