2010-03-19 69 views
0

我是内存管理新手,正在阅读关于如何最佳发布属性的不同内容。什么是释放objective-c属性的最佳方式?

如果我有:
在.H:

@property(retain) NSString *myStr; 

和.M:

@synthesize myStr = _iVarStr; 

如果我的dealloc有:

[_iVarStr release]; 

self.myStr = nil; 

还是别的?

谢谢!

+1

在相关说明中,尽可能尝试使用'nonatomic'属性。根据Apple的说法,它可以显着提高性能(如果进入多线程编程,则会以一定风险为代价)。 –

+0

答案可能取决于setter和getters是如何实现/合成的? – Kreegr

+0

是 - 好笔记。为简洁起见,省略了非原子。 – Kreegr

回答

1

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

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

同时,myStr的setter方法看起来大致是这样的:

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

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

有什么区别?后者将指针设置为零。这更好,因为如果我们(意外地)向释放的对象发送消息,如果指针不为零(EXC_BAD_ACCESS),我们会崩溃。老实说,因为你在-dealloc中,反正这个对象被销毁了,所以你使用什么并不重要。

+0

这回答了我的原始问题合成setters和getters。 但我很清楚,对于自定义设置者或不同的属性属性,答案可能会有所不同。卸妆的回应也非常有帮助 - http://stackoverflow.com/questions/1458178/iphone-dealloc-release-vs-nil/2371133#2371133 感谢您的回应! – Kreegr

0

你的dealloc应该是这样的:

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

虽然属性设置为无可能,我担心意想不到的副作用或可能无法实现目标,目前正在释放的变化引发的志愿行动。

+0

请解释为什么这是要求麻烦。 –

+0

示例说明为什么你应该在'dealloc'中使用属性设置器:http://stackoverflow.com/questions/192721#192852 –

+0

永远不要说永远。有时,在dealloc中设置属性是有意义的(特别是当setter有一些重要的副作用时,例如设置观察者)。 –

0

我推荐你用dealloc方法使用self.ivar=nil(代码ivar=nil以前我写错了)的方式。因为,如果ivar的财产从保留更改为分配(或从分配保留),则不必更改代码。

+0

如果你的ivars是'assign',那么你必须特别小心,你的对象不会从你的下面被释放。 –

+0

这对我来说没有意义,因为只是将内部ivar设置为零就不会释放它 - 这对分配属性有意义但不保留。 –

+0

对不起,我犯了一个错误。确切的方法是'self.ivar = nil'。只有'ivar = nil'是不好的。 – KatokichiSoft

0

当属性设置为留住然后

self.ivar = nil; 

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

+0

是的。 Saurabh答案中列出的代码非常接近综合变压器。 –

相关问题