发布objective-c属性的最佳方法是什么?

时间:2010-03-19 15:29:39

标签: iphone objective-c xcode memory-management properties

我是内存管理新手,正在阅读有关如何最佳发布属性的不同内容。

如果我有:
在.h:

@property(retain) NSString *myStr;

和.m:

@synthesize myStr = _iVarStr;

我的dealloc应该有:

[_iVarStr release];  

self.myStr = nil;   

或其他什么?

谢谢!

4 个答案:

答案 0 :(得分:1)

self.myStr = nil[myStr release]最终都会做同样的事情。

调用[myStr release]很明显,只是发布它。

与此同时,myStr的setter方法看起来大致,如下所示:

- (void)setMyStr:(NSString *)newMyStr
{
    [newMyStr retain];
    [myStr release];
    myStr = newMyStr;
}

所以当我们做self.myStr = nil时,我们首先保留一个nil对象,它什么都不做。然后我们发布旧变量,这就是我们想要的。最后,我们将指针设置为nil。

有什么区别?后者将指针设置为nil。这样更好,因为如果我们(意外地)向发布的对象发送消息,如果指针不是nil(EXC_BAD_ACCESS),则会崩溃。老实说,既然你在-dealloc中,那么对象就会被破坏,所以你使用它并不重要。

答案 1 :(得分:0)

你的dealloc应该是这样的:

- (void)dealloc {
  [_iVarStr release];
  [super dealloc];
}

虽然可以将属性设置为nil,但我担心由于更改而触发的意外副作用或KVO操作可能无法实现对象当前被释放。

答案 2 :(得分:0)

我建议您在dealloc方法中使用self.ivar=nil(之前我写的代码ivar=nil是错误的)。因为,如果ivar的属性从retain更改为assign(或从assign更改为retain),则不必更改代码。

答案 3 :(得分:0)

当属性设置为保留时

self.ivar = nil;

将正确管理内存分配。对于其他房产类型,请查看official documentation页面。它还有一堆示例代码,因此您可以了解所有选项在“引擎盖下”发生的情况。