我正在尝试学习iOS 5中的自动引用计数。现在这个问题的第一部分应该很简单:
我做 NOT 是否需要明确写明是否正确 使用ARC时,我的dealloc中的release-property语句?其他 是的,以下 NOT 是否需要明确 的dealloc?
@interface MyClass : NSObject
@property (strong, nonatomic) NSObject* myProperty;
@end
@implementation MyClass
@synthesize myProperty;
@end
我的下一个更重要的问题来自Transitioning to ARC Release Notes文档中的一行:
您不必(实际上不能)释放实例变量,但您可能需要在系统类和其他未使用ARC编译的代码上调用[self setDelegate:nil]。
这引出了一个问题:我怎么知道哪些系统类没有用ARC编译?我什么时候应该创建自己的dealloc并明确地将强保留属性设置为nil?我是否应该假设属性中使用的所有NS和UI框架类都需要显式的dealloc?
在使用手动参考追踪时,有关SO和其他地方有关释放财产支持ivar的做法的大量信息,但使用ARC时相对较少。
答案 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
。
长答案:即使在ARC下, 也应该<{1}}中的自定义合成属性。你应该在dealloc
。
重点是你的自定义合成属性在无效方面应该是安全和对称的。
计时器的可能设定器:
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];
}
,dealloc
,didReceiveMemoryWarning
,...的任何代码,您的财产可以安全公开。如果您担心viewDidUnload
中的属性为nil,那么您可能需要再次检查您的安装人员。