2010-11-03 50 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