38 votes

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

Je règle quelques problèmes de mémoire avec mon application iPhone et je viens de penser à quelques bases. Si je configure un ivar et que je ne l'utilise jamais pendant la durée de vie de mon objet, 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
 

56voto

Chuck Points 138930

Les variables d'instance sont initialisées à 0 avant que votre initialiseur ne s'exécute.

11voto

BJ Homer Points 29168

Oui, ivars sont toujours initialisées à 0/nul/NULLE/NON/etc.

Cependant, si elle vous aide à comprendre ce qu'il se passe, d'aller pour elle. L'impact sur les performances est négligeable. Vous n'avez pas besoin de le faire, mais il ne sera pas causer des problèmes si vous ne.

0voto

e.James Points 51680

Je trouve que c'est une bonne pratique de toujours régler ces ivars d' nil dans la init méthode. De cette façon, vous êtes absolument sûr que votre appel à l' release dans le destructeur ne peut pas causer des problèmes.

Si il s'avère que l'Objective-C n'est automatiquement mis à nil, et pour quelque raison que vous vous retrouvez avec un goulot d'étranglement de vitesse qui peut être amélioré par la suppression de ces affectations (très peu probable), alors vous pouvez vous soucier de la suppression d'eux. Dans l'intervalle, les mettre tous à l' nil et le sommeil plus facile :)

mise à jour: BJ Homer et Chuck ont souligné que le ivars sera automatiquement mis à zéro, alors maintenant, c'est une décision sur le style.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X