Ich habe gerade gelesen, wie in einer Init-Methode ordnungsgemäß fehlschlagen, und die Dokumente scheinen sich nicht zu widersprechen. Man empfiehlt, eine Ausnahme zu werfen, während die anderen das Aufräumen empfehlen und null zurückgeben. Was ist die aktuelle Best Practice hier?[Self-Release], [Self-Dealloc] oder [Super Dealloc] in Init-Methoden?
Antwort
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;
}
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?
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. –
Das Speicherleck ist, was ich vermeiden möchte. – Kevin
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
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.
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.
- 1. Soll ViewDidUnload super viewDidUnload oder dealloc aufrufen?
- 2. Spielt es eine Rolle, wann Super in Dealloc aufgerufen wird?
- 3. "Missing [Super Dealloc]" Warnung in einem ARC-Projekt
- 4. Ist es OK, Code nach [Super Dealloc] zu schreiben?
- 5. Warum muss ich zuerst super-dealloc aufrufen, und nicht zuerst?
- 6. dealloc, Freigabe verwenden oder für Eigenschaften auf Null setzen?
- 7. iPhone dealloc und viewDidUnload Problem
- 8. Eigenschaften in Dealloc: Release dann auf Null gesetzt? oder einfach
- 9. Eine Super-Klasse Super-Klasse Super
- 10. Freigabe in viewDidUnload und dealloc beides?
- 11. Dealloc wird nicht aufgerufen
- 12. Aufruf Super-Super-Methode
- 13. Objective-C Stil Frage: Haben Sie "release" oder "nil" -Eigenschaften in dealloc?
- 14. ‚super‘ außerhalb der Funktion oder Klasse
- 15. Release, Dealloc und die Selbstreferenz
- 16. Zweck der Methoden, die nur super aufrufen?
- 17. Unterschied zwischen Freisetzung und dealloc in Objective-c
- 18. Python super() Argumente: warum nicht super (obj)?
- 19. Warum stürzt UITableView App in Dealloc ab?
- 20. Müssen Sie IBoulets in dealloc freigeben?
- 21. Was ist dealloc in objective C
- 22. Einstellungen IBOutlets zu Null in Dealloc
- 23. IOS Dealloc wird nie aufgerufen
- 24. ARC Referenzzählung Dealloc und Release
- 25. Was ist "Super" in Objective-C? (Selbst! = Super)?
- 26. RSpec Mock oder Stub Super in einem Modell
- 27. Super in Python 2.7
- 28. Muss ich [Super Init] oder [Super InitWithCoder] usw. für NSObject aufrufen
- 29. Sollte -dealloc etwas anderes tun, als Speicher freizugeben?
- 30. Java. Wie Super() aufrufen super() in überschriebene Methode (Zucht- Methode)
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