我是内存管理新手,正在阅读关于如何最佳发布属性的不同内容。什么是释放objective-c属性的最佳方式?
如果我有:
在.H:
@property(retain) NSString *myStr;
和.M:
@synthesize myStr = _iVarStr;
如果我的dealloc有:
[_iVarStr release];
或
self.myStr = nil;
还是别的?
谢谢!
我是内存管理新手,正在阅读关于如何最佳发布属性的不同内容。什么是释放objective-c属性的最佳方式?
如果我有:
在.H:
@property(retain) NSString *myStr;
和.M:
@synthesize myStr = _iVarStr;
如果我的dealloc有:
[_iVarStr release];
或
self.myStr = nil;
还是别的?
谢谢!
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中,反正这个对象被销毁了,所以你使用什么并不重要。
这回答了我的原始问题合成setters和getters。 但我很清楚,对于自定义设置者或不同的属性属性,答案可能会有所不同。卸妆的回应也非常有帮助 - http://stackoverflow.com/questions/1458178/iphone-dealloc-release-vs-nil/2371133#2371133 感谢您的回应! – Kreegr
你的dealloc应该是这样的:
- (void)dealloc {
[_iVarStr release];
[super dealloc];
}
虽然属性设置为无可能,我担心意想不到的副作用或可能无法实现目标,目前正在释放的变化引发的志愿行动。
请解释为什么这是要求麻烦。 –
示例说明为什么你应该在'dealloc'中使用属性设置器:http://stackoverflow.com/questions/192721#192852 –
永远不要说永远。有时,在dealloc中设置属性是有意义的(特别是当setter有一些重要的副作用时,例如设置观察者)。 –
我推荐你用dealloc方法使用self.ivar=nil
(代码ivar=nil
以前我写错了)的方式。因为,如果ivar的财产从保留更改为分配(或从分配保留),则不必更改代码。
如果你的ivars是'assign',那么你必须特别小心,你的对象不会从你的下面被释放。 –
这对我来说没有意义,因为只是将内部ivar设置为零就不会释放它 - 这对分配属性有意义但不保留。 –
对不起,我犯了一个错误。确切的方法是'self.ivar = nil'。只有'ivar = nil'是不好的。 – KatokichiSoft
当属性设置为留住然后
self.ivar = nil;
将妥善管理的内存分配。对于其他房产类型请查看official documentation页面。它还有一堆示例代码,因此您可以理解所有选项“引擎盖下”会发生的情况。
是的。 Saurabh答案中列出的代码非常接近综合变压器。 –
在相关说明中,尽可能尝试使用'nonatomic'属性。根据Apple的说法,它可以显着提高性能(如果进入多线程编程,则会以一定风险为代价)。 –
答案可能取决于setter和getters是如何实现/合成的? – Kreegr
是 - 好笔记。为简洁起见,省略了非原子。 – Kreegr