2010-12-02 6 views
30

In dem Fall, wenn wir Nil in der Init-Methode zurückgeben, was passiert mit Retain Count und wer wird dieses Objekt freigeben?Returning Nil in der Init in Objective C-Code

Als ich angerufen habe, sobald wir Allo aufgerufen haben (was vor Init passieren wird), wird die Retain-Anzahl zu 1. Jetzt wird init aufgerufen und sagen, aus irgendeinem Grund kann das Objekt nicht initialisiert werden, so dass es zurückkehrt Null.

Und es sieht so aus, als ob wir jetzt das Objekt mit retain count gleich 1 haben und niemand hat Bezug darauf, um Release zu nennen.

Sollten wir [in select autorelease] init für einen solchen Fall aufrufen oder etwas anderes tun?

+1

Mögliche Doppel http://stackoverflow.com/questions/4083654/doesnt-the-standard-object-initialization-in-objective-c-lead-to-memory-leaks – taskinoor

Antwort

42

Siehe Allocating and Initializing Objects in der Dokumentation zu tun hat.

Insbesondere wenn Sie einen Fehler in den Initialisierer haben, können Sie dann releaseself und zurück nil:

- init 
{ 
    self = [super init]; 
    if (self) { 
     if (... failed to initialize something in self ...) { 
      [self release]; 
      return nil; 
     } 
    } 
    return self; 
} 

nun überlegen, was passiert, wenn man [super init] anrufen und es gibt nil. Das obige Muster wurde bereits verwendet, was self wurde veröffentlicht, und die nil Rückkehr zeigt an, dass die Instanz verschwunden ist. Es gibt kein Leck und alle sind glücklich.

Dies ist auch ein gültiges Muster (unter der Annahme, dass self eine Instanz von MyClass ist):

- init 
{ 
    self = [super init]; 
    if (self) { 
     ... normal initialization here ... 
    } else { 
     self = [MyClass genericInstanceWhenInitializationGoesBad]; 
     self = [self retain]; 
    } 
    return self; 
} 

Da init erwartet wird, etwas zurückzugeben, die retained ist (implizit von +alloc gekettet zu werden), dann ist das [self retain], obwohl es doof aussieht, ist eigentlich richtig. Die self = [self retain] ist gerade extra defensiv, falls MyClassretain außer Kraft setzt, etwas Seltsames zu tun.

+0

Danke. Ich habs. Das habe ich irgendwie in der Dokumentation vermisst, dass ich mich selbst loslassen muss, bevor ich zurückkomme. –

+0

Versuchen Sie diesen Link auf halber Seite: "Fehler bei der Verarbeitung der Initialisierung" http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/ObjectiveC/Chapters/ocAllocInit.html#//apple_ref/doc/uid/TP30001163-CH22-105377 – TigerCoding

+2

Yup. Danke ... SO braucht wirklich Compiler und Laufzeit-Integration. – bbum

-5

der Regel werden Sie

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

    return nil; 
} 
// do some init job here 
return self; 

nennen Es ist nicht Ihre Aufgabe, das selbst zu Autorelease, denn wenn Sie es haben, es schon gleich Null ist, also auch wenn Sie [self autorelease]; nennen, es tut nichts.

ich denke, die NSObject init-Methode mit dem Objekt bereits

+0

warum nicht 'if (Selbst-) { // einige init job hier } return self' ? – ersentekin

Verwandte Themen