2009-05-25 19 views

Antwort

16

Ich glaube, dass die allgemein anerkannte Praxis ist, bei Versagen Nil zurück zu geben. Aber Sie wollen sich selbst lösen ein Leck zu vermeiden:

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

Danke für das Feedback Jungs. Das war es, was ich tat und dachte, dass es der richtige Ansatz war, aber die Verweise auf die anderen beiden Methoden in den Dokumenten ließen mich denken, dass es einige Spezialfälle geben könnte, die beachtet werden mussten. – Kevin

0

Die Methode, die ich immer verwendet habe, ist Aufräumen und Null zurück. Die drei Methoden, die Sie in Ihrem Fragetitel erwähnen, können zu höheren Segmenthäufigkeiten in der Aufrufhierarchie führen, während die Rückgabe von nil dies nicht tut. Ich glaube, dass die Apple-Redaktion selbst sagt, dass sie beim Scheitern null zurückgeben. Wo finden Sie Diskrepanzen?

+2

Wenn Sie einfach nil zurückgeben, wird der Speicher gelöscht, da der Aufruf von allocation ein Objekt mit einem Retain-Zählerstand von eins erstellt hat. –

+0

Das Speicherleck ist, was ich vermeiden möchte. – Kevin

+0

Links zu docs: Fehlererkennung bei der Initialisierung - http://tr.im/mlyA ein Initializer Implementierung - http://tr.im/mlyX Sie werden bemerken, dass unter dem Beispielcode in dem zweiten Glied Sie empfehlen stattdessen, eine Ausnahme zu werfen. Ich bin mir ziemlich sicher, dass das nicht die aktuelle Best Practice ist. – Kevin

6

Cocoa Philosophie auf Ausnahmen ist, dass sie nur in Situationen geworfen werden sollen, die Programmierer Fehler sind, wie ein illegales Argument an eine Methode übergeben. Wenn etwas anderes schief geht, sollte die Methode nur NO oder Nil zurückgeben und hoffentlich die Details über einen NSError ** "out" -Parameter melden.

Dies umfasst -init Methoden. Wenn die Fehlersituation etwas ist, das legitim im fertigen Produkt auftreten könnte, sollte die Methode self (um ein Leck zu vermeiden) und nil zurückgeben.

9

Die richtigen Lösungen (Ausnahmen und/oder [self release]; return nil;) wurden abgedeckt, ich werde die falschen Lösungen ansprechen.

Senden Sie nicht direkt dealloc. Das ist release's Job. (Und wenn Sie Ihren Code immer unter GC läuft, dealloc ist nicht anwendbar, und ich konnte nur auf, welche Probleme spekulieren nannte es verursachen würde.)

Doppel-nicht Gebrauch super es direkt zu senden. Das würde über Ihre eigene dealloc Implementierung überspringen.

Verwandte Themen