[英]ARC does not dealloc when pointer is set to nil (using factory methods)
[英]Do I set properties to nil in dealloc when using ARC?
我正在尝试学习iOS 5中的自动引用计数。现在这个问题的第一部分应该很简单:
它是正确的,使用ARC时,我不需要写在我的dealloc明确释放属性声明? 换句话说,这是真的,以下不需要明确的dealloc的?
@interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end
我的下一个也是更重要的问题来自“ 转换为ARC发行说明”文档中的一行:
您不必(实际上不能)释放实例变量,但您可能需要在系统类和其他未使用ARC编译的代码上调用[self setDelegate:nil]。
这引出了一个问题:我怎么知道哪些系统类没有用ARC编译? 我什么时候应该创建自己的dealloc并明确地将强保留属性设置为nil? 我应该假设属性中使用的所有NS和UI框架类都需要显式的deallocs吗?
在使用手动参考跟踪时,有关SO和其他地方有关释放财产支持ivar的做法的大量信息,但在使用ARC时相对较少。
简短的回答 :不,你不必在ARC下的dealloc
删除属性。
答案很长 :即使在手动内存管理中,也不应该在dealloc
删除属性。
在MRR中,您应该释放您的ivars 。 Nilling out属性意味着调用setter,它可以调用不应该在dealloc
触及的代码(例如,如果你的类或子类覆盖setter)。 同样,它可能会触发KVO通知。 释放ivar反而避免了这些不良行为。
在ARC中,系统会自动为您释放任何ivars,因此,如果这就是您所做的一切,您甚至不必实现dealloc
。 但是,如果您有任何需要特殊处理的非对象ivars(例如,您需要free()
分配缓冲区free()
),您仍然必须处理dealloc
那些。
此外,如果您将自己设置为任何对象的委托,则应该在dealloc
取消设置该关系(这是关于调用[obj setDelegate:nil]
)。 关于在未使用ARC编译的类上执行此操作的说明是对弱属性的认可。 如果类明确地将其delegate
属性标记为weak
那么您不必执行此操作,因为弱属性的性质意味着它将为您填写。 但是如果属性被标记为assign
那么你应该在你的dealloc
中将它取出来,否则该类会留下一个悬空指针,如果它试图向其委托发送消息,它可能会崩溃。 请注意,这仅适用于非保留关系,例如委托。
只是给出相反的答案......
简短的回答 :不,你不必在ARC下的dealloc
自动合成属性。 而且你不必在init
使用setter。
答案很长 :即使在ARC下,你也应该在dealloc
找出自定义合成的属性。 你应该在init
使用setter。
关键是你的自定义合成属性应该是安全的和对称的无效。
可能的计时器设定器:
-(void)setTimer:(NSTimer *)timer
{
if (timer == _timer)
return;
[timer retain];
[_timer invalidate];
[_timer release];
_timer = timer;
[_timer fire];
}
滚动视图,tableview,webview,textfield,...的可能setter:
-(void)setScrollView:(UIScrollView *)scrollView
{
if (scrollView == _scrollView)
return;
[scrollView retain];
[_scrollView setDelegate:nil];
[_scrollView release];
_scrollView = scrollView;
[_scrollView setDelegate:self];
}
可能的KVO属性的setter:
-(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
nil属性,那么你可能需要再次检查你的setter。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.