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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

我正在尝试学习iOS 5中的自动引用计数。现在这个问题的第一部分应该很简单: 在使用ARC时,我不需要在dealloc中写明确的释放属性语句,这是否正确?换句话说,下面是不是需要一个明确的dealloc? @interface MyClass:NSObject @property(强,非原子)NSObject * myProperty; @结束 @implementation MyClass @synthesize myProperty; @结束 我的下一个更重要的问题来自“转换到ARC版本说明”文档中的一行: 不必释放实例变量,但是可能需要在系统类和其他未使用ARC编译的代码上调用[self setDelegate:nil]。 这引出了一个问题:我怎么知道哪些系统类不是用ARC编译的?什么时候应该创建自己的dealloc并明确地将强保留属性设置为零?我应该假设属性中使用的所有NS和UI框架类都需要显式释放吗? 有很多关于SO和其他地方关于释放财产支持ivar的做法的信息,但在使用ARC时相对较少。

提问于
用户回答回答于

不需要在dealloc在ARC下。

在MRR中,你应该释放你的IVARS。ningout属性意味着调用setter,这可能会调用它不应该触及的代码。dealloc(例如,如果类或子类重写了setter)。类似地,它可能触发KVO通知。相反,释放IVAR可以避免这些不想要的行为。

在ARC中,系统会自动释放任何Ivar,所以如果所做的就是这些,甚至不需要实现dealloc。但是,如果有任何需要特殊处理的非对象ivars(例如,需要分配的缓冲区)。free())你还得处理那些dealloc.

此外,如果已将自己设置为任何对象的委托,则应取消将该关系设置为dealloc(这是关于打电话的一点[obj setDelegate:nil])。关于在未用ARC编译的类上执行此操作的说明是对弱属性的认可。如果类显式标记其delegate财产weak然后你就不用这么做了,因为弱属性的本质意味着它会被被标记为assign那你就应该在你的dealloc,否则类将留下一个悬空指针,如果它试图向其委托发送消息,则可能会崩溃出来。

用户回答回答于

自定义合成属性为零,dealloc甚至在ARC下。而你应该使用设置器init.

重点是,自定义合成属性应该是安全的和对称的关于零化。

定时器的可能设置者:

-(void)setTimer:(NSTimer *)timer
{
    if (timer == _timer)
        return;

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

一个可能的设置器,用于滚动视图、表视图、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];
}

那么就不必重复任何代码deallocdidReceiveMemoryWarningviewDidUnload.

扫码关注云+社区