2010-08-04 52 views
7

我是Objective-C(和stackoverflow)的新手,我对有关属性的最佳实践略微转过身。dealloc中的属性:release然后设置为nil?或者简单地释放

我的理解是,当你彻底完成一个属性时,你可以通过释放它们来避免错误,然后立即设置为零,以便随后的消息也返回nil而不是异常。

[myProperty release],myProperty = nil;

但是,当涉及dealloc'复制'和'保留'属性是否有任何需要做到这一点?还是做了一个简单的

[myProperty发布] 剪了吗?另外,我是否正确无需在dealloc中释放'assign'属性?

谢谢!

回答

17

是否释放,但不要打扰设置为零。通过您的@synthesized调节器设置为零:

self.myProperty = nil 

将释放你的旧价值重新分配的部分(尽管在评论中所指出,可能产生有害的副作用),而仅仅是为了你的成员变量赋值零:

myProperty = nil 

不会。

[myProperty release] 

是您所需要的。

(和你对“分配”的属性是正确的。)

+3

+1,释放是你所需要的,但我会提醒不要在'dealloc中使用'self.myProperty = nil' '(它可以激发KVO方法并通知观察者尝试访问部分解除分配的对象......) – 2010-08-04 03:13:54

+4

正如戴夫所说,目前推荐的(苹果)实践并不是使用访问器在dealloc中分配零(因此释放)。它不仅可以激发KVO方法,而且set访问器可能已被一个子类覆盖。 – JeremyP 2010-08-04 08:33:38

+1

现在更老更明智了......最佳实践似乎是在viewDidUnload中使用self.myProperty = nil作为IB插座属性。这允许viewController重新建立视图层次,如果它已被低内存拆除。 – averydev 2011-08-31 06:55:07

0

@戴夫德隆和JeremyP:我认为我们可以说,“使用继承消息(直接或间接通过一个,调用一些部分来自超)得到控制而“建设“一个对象(通过初始......,新建......或复制......)就像建造房屋并在没有人确定的情况下将屋顶放在其上,如果地下室已经存在。而这样做,而dealloc可能是相当于拆掉了房子,首先敲开基础墙,不确定是否在它的地窖里“。

虽然使用没有任何继承的方法也可以做到这一点 - 但是如果你是你自己的,你可以(并有)来控制它。

问候

0

@戴夫德朗:当执行对象的dealloc方法,不再被使用的对象。所有kvo观察员应该在那一刻被移除,否则将会减少。无论如何 - 即使一个观察者会看到这个变化,对象仍然会存在(至少部分)。

重写的访问器是我认为的正确参数。但是,对于您自己的类,使用访问器可能仍然更简单。特别是当使用合成方法,你知道的语义,但没有关于访问的细节...

相关问题