2010-11-03 24 views
1

J'ai un objet ivar foo dans une sous-classe NSManagedObject bar que j'ai besoin d'être là à tout moment, tant que l'objet existe.NSManagedObject init/dealloc equivalent

Pour vous assurer que foo a été créé correctement, j'ai sous-classé awakeFromInsert pour créer foo lorsque bar est créé. J'ai fait la même chose dans awakeFromFetch, pour m'assurer que foo est là quand bar est récupérée du magasin.

Pour contrer cela, je publie foo dans willTurnIntoFault et dans prepareForDeletion.

Cependant, il s'avère que lorsque je supprime bar, à la fois prepareForDeletion et ensuite willTurnIntoFault sont appelés, libérant deux fois foo.

Je réalise que je ne peux probablement pas le publier dans prepareForDeletion, mais j'aimerais savoir quelle est la meilleure pratique ici, donc je comprends quand quelque chose se transforme en erreur, etc. Pour un objet normal, je Il suffit de créer foo dans init et de le détruire dans dealloc.

Merci!

Répondre

2

Au lieu de relâcher l'ivar, relâchez-le et réglez-le sur nil. Libérer nil n'a aucun effet, donc vous serez OK si cela arrive deux fois.

Mieux encore, faites foo une propriété avec la sémantique retain et réglez toujours par -setFoo:.

+0

Je comprends la première partie, mais qu'est-ce que cela fait d'en faire une propriété avec retenue? Ou voulez-vous dire self.foo = nil, puisque cela libère automatiquement l'ivar? – Christoph

+0

Oui, si foo est déclaré comme "@property (readwrite, retain)" et synthétisé dans @implementation de votre classe, alors [self setFoo: nil] et self.foo = nil le relâcheront. (De plus, le paramétrer sur une nouvelle valeur libèrera l'ancienne.) C'est une bonne habitude à prendre parce que vous: a) n'oublierez pas de libérer des ivars, et b) ne planterez pas si vous envoyez un message ivar libéré par la suite (car il sera nul). – dwineman

+0

Oui, d'accord. Donc dans init (généralement, pas dans ce cas), je crée juste un objet local pour foo, fais self.foo = peu importe, et ensuite [quelle que soit la version], n'est-ce pas? – Christoph