我是内存管理新手,正在阅读有关如何最佳发布属性的不同内容。
如果我有:
在.h:
@property(retain) NSString *myStr;
和.m:
@synthesize myStr = _iVarStr;
我的dealloc应该有:
[_iVarStr release];
或
self.myStr = nil;
或其他什么?
谢谢!
答案 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页面。它还有一堆示例代码,因此您可以了解所有选项在“引擎盖下”发生的情况。