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!
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
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
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