我正在尝试学习iOS 5中的自动引用计数。现在这个问题的第一部分应该很简单:
@接口MyClass : NSObject @property (强,非原子) NSObject* myProperty;@end @implementation MyClass @synthesize;@end
您不必(实际上不能)释放实例变量,但您可能需要在系统类和其他不使用ARC编译的代码上调用self setDelegate:nil。
这就引出了一个问题:我如何知道哪些系统类不是用ARC编译的?什么时候我应该创建自己的dealloc并显式地将强保留属性设置为nil?我是否应该假设属性中使用的所有NS和UI框架类都需要显式的deallocs?
在使用手动引用跟踪时,关于释放房产的支持ivar的实践,在SO和其他地方有大量的信息,但在使用ARC时,关于这方面的信息相对较少。
发布于 2011-10-27 02:05:50
Short answer:不,您不必在ARC下的dealloc
中将属性设为空。
Long answer:dealloc
中的属性永远不应该为空,即使是在手动内存管理中也是如此。
在MRR中,你应该释放你的ivars。code属性意味着调用setter,这可能会调用在dealloc
中不应该触及的代码(例如,如果您的类或子类覆盖了setter)。类似地,它可能触发KVO通知。相反,释放ivar可以避免这些不受欢迎的行为。
在ARC中,系统会自动为你释放任何dealloc
,所以如果这就是你要做的全部事情,你甚至不需要实现ivars。但是,如果您有任何需要特殊处理的非对象dealloc
(例如,您需要对其进行free()
的已分配缓冲区),您仍然必须在ivars中处理它们。
此外,如果您已经将自己设置为任何对象的代理,则应该在dealloc
中取消设置该关系(这是调用[obj setDelegate:nil]
的一小部分)。关于在不是用ARC编译的类上这样做的说明是对弱属性的认可。如果该类显式地将其delegate
属性标记为weak
,那么您就不必这样做了,因为弱属性的性质意味着它将为您详细说明。但是,如果该属性被标记为assign
,那么您应该在您的dealloc
中将其置零,否则该类将留下一个悬空指针,并且如果它试图向其委托发送消息,则很可能会崩溃。请注意,这仅适用于非保留关系,如委托。
发布于 2014-06-11 16:00:09
给出相反的答案..。
Short answer:不,你不必在ARC下的dealloc
中清除自动合成的属性。对于init
中的设置,您不必使用设置器。
Long answer:即使在ARC下,你也不应该在dealloc
中使用自定义合成的属性。对于init
中的设置,您应该使用setter。
关键是您的自定义合成属性应该是安全的,并且在无效方面是对称的。
一个可能的定时器设置器:
-(void)setTimer:(NSTimer *)timer
{
if (timer == _timer)
return;
[timer retain];
[_timer invalidate];
[_timer release];
_timer = timer;
[_timer fire];
}
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属性的可能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 out属性,那么可能是时候再次检查setter了。
https://stackoverflow.com/questions/7906804
复制相似问题