Les variables d’instance sont-elles définies sur nil par défaut dans Objective-C?

Je règle certains problèmes de mémoire avec mon application iPhone et je pense à quelques notions de base. Si je configure un ivar et que je ne finis jamais par l’utiliser dans la durée de vie de mon object, lorsque j’appelle dealloc dessus, cela posera-t-il un problème? Par exemple

@interface testClass { id myobject; } @property (nonatomic, retain) id myobject; @end @implementation testClass @synthesize myobject; - (id)init { ... // Do I have to set myobject to nil here? // So if myobject isn't used the dealloc call to nil // will be okay? Or can you release the variable without // having set every object to nil that you may may not use ... } ... // Somewhere in the code, myobject may be set to // an instance of an object via self.myobject = [AnObject grabAnObject] // but the object may be left alone ... - (void)dealloc { [myobject release]; [super dealloc]; } @end 

Les variables d’instance sont initialisées à 0 avant l’exécution de votre initialiseur.

Oui, les ivars sont toujours initialisés à 0 / nil / NULL / NO / etc.

Cependant, si cela vous aide à comprendre ce qui se passe, allez-y. L’impact sur la performance est négligeable. Vous n’avez pas besoin de le faire, mais cela ne posera aucun problème si vous le faites.

Je trouve que c’est une bonne pratique de toujours mettre ces ivars à nil dans la méthode init . De cette façon, vous êtes absolument certain que votre appel à release dans le destructeur ne peut pas causer de problèmes.

S’il s’avère qu’Objective-C les met automatiquement à nil et que, pour une raison quelconque, vous vous retrouvez avec un goulot d’étranglement de la vitesse qui peut être amélioré en supprimant ces affectations (hautement improbable), vous pouvez vous soucier de les supprimer. En attendant, mettez-les au nil et dormez plus facilement 🙂

mise à jour: BJ Homer et Chuck ont ​​souligné que les ivars seront automatiquement mis à zéro, alors maintenant, il s’agit d’une décision de style.