Dois-je libérer toujours soi-même pour les méthodes de démarrage a échoué?
-
20-09-2019 - |
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;
}
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 obteneznil
retour d'une invocation de initialiseur de la superclasse, vous ne devriez pas appeler aussirelease
.
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