首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当使用ARC时,我是否在dealloc中将属性设置为nil?

当使用ARC时,我是否在dealloc中将属性设置为nil?
EN

Stack Overflow用户
提问于 2011-10-27 01:58:40
回答 2查看 33.6K关注 0票数 125

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

  1. 当使用ARC时,我不需要在我的dealloc中编写显式的release-property语句,这对吗?换句话说,下面这句话是真的吗?不需要显式的dealloc吗?

@接口MyClass : NSObject @property (强,非原子) NSObject* myProperty;@end @implementation MyClass @synthesize;@end

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

这就引出了一个问题:我如何知道哪些系统类不是用ARC编译的?什么时候我应该创建自己的dealloc并显式地将强保留属性设置为nil?我是否应该假设属性中使用的所有NS和UI框架类都需要显式的deallocs?

在使用手动引用跟踪时,关于释放房产的支持ivar的实践,在SO和其他地方有大量的信息,但在使用ARC时,关于这方面的信息相对较少。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-27 02:05:50

Short answer:不,您不必在ARC下的dealloc中将属性设为空。

Long answerdealloc中的属性永远不应该为空,即使是在手动内存管理中也是如此。

在MRR中,你应该释放你的ivars。code属性意味着调用setter,这可能会调用在dealloc中不应该触及的代码(例如,如果您的类或子类覆盖了setter)。类似地,它可能触发KVO通知。相反,释放ivar可以避免这些不受欢迎的行为。

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

此外,如果您已经将自己设置为任何对象的代理,则应该在dealloc中取消设置该关系(这是调用[obj setDelegate:nil]的一小部分)。关于在不是用ARC编译的类上这样做的说明是对弱属性的认可。如果该类显式地将其delegate属性标记为weak,那么您就不必这样做了,因为弱属性的性质意味着它将为您详细说明。但是,如果该属性被标记为assign,那么您应该在您的dealloc中将其置零,否则该类将留下一个悬空指针,并且如果它试图向其委托发送消息,则很可能会崩溃。请注意,这仅适用于非保留关系,如委托。

票数 197
EN

Stack Overflow用户

发布于 2014-06-11 16:00:09

给出相反的答案..。

Short answer:不,你不必在ARC下的dealloc中清除自动合成的属性。对于init中的设置,您不必使用设置器。

Long answer:即使在ARC下,你也不应该在dealloc中使用自定义合成的属性。对于init中的设置,您应该使用setter。

关键是您的自定义合成属性应该是安全的,并且在无效方面是对称的。

一个可能的定时器设置器:

代码语言:javascript
复制
-(void)setTimer:(NSTimer *)timer
{
    if (timer == _timer)
        return;

    [timer retain];
    [_timer invalidate];
    [_timer release];
    _timer = timer;
    [_timer fire];
}

scrollview、tableview、webview、textfield等的可能设置器...:

代码语言:javascript
复制
-(void)setScrollView:(UIScrollView *)scrollView
{
    if (scrollView == _scrollView)
        return;

    [scrollView retain];
    [_scrollView setDelegate:nil];
    [_scrollView release];
    _scrollView = scrollView;
    [_scrollView setDelegate:self];
}

KVO属性的可能setter:

代码语言:javascript
复制
-(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中的nil out属性,那么可能是时候再次检查setter了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7906804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档