2010-11-03 60 views
1

我有一个NSManagedObject子类bar内的对象ivar foo,我需要在任何时候都在那里,只要对象存在。NSManagedObject初始化/ dealloc等效

为了确保foo已正确创建,我已创建bar子类型awakeFromInsert以创建foo。我在awakeFromFetch中做了同样的事情,以确保foobar被从商店中提取出来。

为了解决这个问题,我在willTurnIntoFault和prepareForDeletion中释放foo

但是,事实证明,当我删除bar时,prepareForDeletion和willTurnIntoFault都被调用,释放foo两次。我知道我可能不会在prepareForDeletion中释放它,但我想知道最佳实践在这里,所以我明白什么时候某些东西变成了故障等等。对于一个普通对象,我在init中创建foo并在dealloc中销毁它。

谢谢!

回答

2

而不是只发布伊娃,释放它并将其设置为nil。发布nil没有任何影响,所以如果发生两次,你会好的。

更好的是,使foo属性具有retain语义并始终通过-setFoo:进行设置。

+0

我了解第一部分,但是将它作为财产与保留有什么关系呢?或者你的意思是self.foo =零,因为那会自动释放伊娃? – Christoph 2010-11-04 03:23:42

+0

是的,如果foo被声明为“@property(readwrite,retain)”并在你的类的@implementation中合成,那么[self setFoo:nil]和self.foo = nil都会释放它。 (另外,将其设置为新值将释放旧值。)这是一个很好的习惯,因为您a)不会忘记释放ivars,并且b)如果发送消息时不会崩溃事后发布ivar(因为它将是零)。 – dwineman 2010-11-04 08:10:24

+0

对,没关系。所以在init中(通常不是这种情况下),我只是为foo创建一个本地对象,做self.foo = whatever,然后[无论发布],对吧? – Christoph 2010-11-05 16:35:36