2011-01-05 3 views
7

J'ai une sous-classe de NSManagedObject, la plupart des propriétés sont dynamiques (créées par l'objet géré), mais j'ai quelques propriétés d'aide qui sont créées comme @synthesize.iphone NSManagedObject - La bonne façon de désallouer?

Quelle est la bonne façon de libérer ces objets ??

- (void)didTurnIntoFault 
{ 
    [self.randomVar release]; 
    [super didTurnIntoFault]; 
} 

ou

- (void)dealloc 
{ 
    [self.randomVar release]; 
    [super dealloc]; 
} 

Répondre

11

Remplacer didTurnIntoFault et les libérer là-bas. Les objets gérés ne sont pas nécessairement désalloués lorsqu'ils sont en défaut.

De l'documentation:

Vous découragez de surcharger dealloc ou finalize parce didTurnIntoFault est généralement un meilleur temps pour effacer les valeurs-un objet géré ne peut pas être remis en état pendant un certain temps après qu'il a été transformé en un faute. Les données de base ne garantissent pas que dealloc ou finalize seront appelés dans tous les scénarios (par exemple, lorsque l'application se ferme); Vous ne devriez donc pas inclure dans ces méthodes les effets secondaires requis (comme l'enregistrement ou la modification du système de fichiers, les préférences de l'utilisateur, etc.).

+1

Fyi à des gens comme moi qui sont confus par le nom du override-- willTurnIntoFault n'indique en aucun cas une erreur ou un "défaut", c'est juste le terme CoreData pour sortir un objet de la circulation. – jpswain

6

Vous voudrez peut-être jeter un coup d'œil à The Core Data Programming Guide. Ces deux passages sont particulièrement pertinents

Si vous définissez l'instance sur mesure variables, vous devez nettoyer ces variables didTurnIntoFault plutôt que dealloc ou finalisez.

et

Vous devriez généralement pas remplacer dealloc ou finaliser pour effacer les propriétés transitoires et d'autres variables. Au lieu de cela, vous devez remplacer didTurnIntoFault.

4

[Cela devrait être un commentaire parce que je signale un problème différent à la question, mais je veux la fonctionnalité de formatage de code].

Ne faites jamais ceci:

[self.randomVar release]; 

qui libère l'objet pointé par le Ivar de support de la propriété, mais ne fait pas le pointeur lui-même nul. Cela signifie que vous avez potentiellement potentiellement un pointeur dangling si la version a pour effet de libérer l'objet. Soit faire ceci:

self.randomVar = nil; 

ou cette

[randomVar release]; // assumes the property is backed by an ivar of the same name. 
randomVar = nil;  // can be omitted if you are in dealloc 

La première forme est préférée partout sauf dans dealloc.

Questions connexes