2011-07-27 3 views
3

Lorsque mon initialiseur personnalisé échoue, je suis censé renvoyer zéro. Quelle est la convention pour nettoyer toute la mémoire que j'ai allouée dans mon initialiseur, que je m'attendais à être nettoyé dans dealloc?Comment faire pour nettoyer la mémoire lorsque l'initialisation personnalisée échoue

Voici un exemple artificiel:

- (id)init 
{ 
    if ((self = [super init])) { 
     instanceVar1 = [[NSString alloc] initWithString:@"blah"]; 
     if (bad_thing_oh_noes) { 
      return nil; 
     } 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [instanceVar1 release]; 

    [super dealloc]; 
} 

Une plus réaliste des circonstances où je ne peux pas vérifier efficacement toutes les conditions d'erreur avant que je ne les allocations seraient désérialisation un objet complexe contenant des tableaux et autres.

De toute façon, est-ce que je nettoie la mémoire allouée avant de renvoyer zéro, puis-je envoyer un message dealloc à moi-même avant de renvoyer nil, ou tout cela est-il géré par magie?

Répondre

2

Si une erreur se produit au cours d'un initialiseur, vous devez appeler release sur self et renvoyer nil.

if (bad_thing_oh_noes) { 
    [self release]; 
    return nil; 
} 

En outre, vous devez vous assurer qu'il est sûr d'appeler dealloc sur un objet partiellement initialisé.

Vous devez appeler le release uniquement au point de défaillance. Si vous obtenez nil à partir de l'initialiseur de la superclasse, vous ne devriez pas appeler release.

Normalement, vous ne devez pas déclencher d'exception lors de l'échec de l'initialisation.

Un exemple de Handling Initialization Failure:

- (id)initWithURL:(NSURL *)aURL error:(NSError **)errorPtr { 

    self = [super init]; 
    if (self) { 

     NSData *data = [[NSData alloc] initWithContentsOfURL:aURL 
             options:NSUncachedRead error:errorPtr]; 

     if (data == nil) { 
      // In this case the error object is created in the NSData initializer 
      [self release]; 
      return nil; 
     } 
     // implementation continues... 
+0

idiot moi, je pensais que je l'ai lu cette documentation, mais j'ai raté la partie qui a répondu à ma question! Merci d'avoir éclairci ça pour moi. :-) – Sandy

+0

@Sandy vous êtes les bienvenus :) – albertamg

Questions connexes