Question

Dois-je libérer toujours moi quand il y a un échec dans init, ou dois-je faire que si j'ai initialisé les variables d'instance d'abord?

Pour d'autres termes, est ce modèle valide? Y at-il un moment où je ne devrais pas libérer auto à l'intérieur d'une méthode d'initialisation, ou devrais-je supposer que si le flux de contrôle entre dans init, l'auto a au moins un nombre de retenir 1?

- (id)init
{
 if ((self = [super init]) == nil)
 {
  [self release];
  return nil;
 }

 //do some init stuff
 if (somethingFailed)
 {
  [self release];
  return nil;
 }
 return self;
}
Était-ce utile?

La solution

Si vous avez besoin d'un certain contrôle dans votre méthode d'initialisation échoue, alors oui, vous devez libérer self. Notez toutefois que si le rendement de [super init] nil il n'a pas de sens d'envoyer à la libération self comme self est nil. Ceci est en fait mal vu par Apple:

  

Vous ne devez appeler [self release] au point de défaillance. Si vous obtenez nil retour d'une invocation de initialiseur de la superclasse, vous ne devriez pas appeler aussi release.

Exemple:

- (id)init
{
   self = [super init];
   if(self) {
       // do some init stuff

       if (somethingFailed)
       {
          [self release]
          self = nil;
       }
   }

   return self;
}

Voir aussi la documentation Mac Dev Center sur Initialisation de manutention non

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top