Ich bitte um weitere Klärung, nachdem ich gesehen habe Was ist für die Freigabe von NSWindowController-Objekten zuständig?
Ich schreibe eine einfache Anwendung zur Bestandsverwaltung für meine Neffen. Ich habe eine Tabellenansicht, die den Inhalt ihrer "Bibliothek" usw. anzeigt. Um einen neuen Gegenstand zur Bibliothek hinzuzufügen, klicken sie auf eine "+"-Schaltfläche. Diese Schaltfläche öffnet ein neues Fenster, in dem sie die Details des Gegenstands eingeben können, und bestätigt die Eingabe, wenn sie auf "OK" klicken.
All das funktioniert sehr gut. Ich habe jedoch eine Frage zur Speicherverwaltung. Um das neue Fenster zu erstellen, verwende ich den folgenden Code:
- (IBAction)addNewItem:(id)sender {
LibraryItemEditorController *editorController =
[[LibraryItemEditorController alloc]
initWithWindowNibName:@"LibraryItemEditor"];
[editorController showWindow:nil];
// editorController is "leaked" here, it seems.
}
Ich kann weder freigeben (noch automatisch freigeben) editorController
am Ende von addNewItem:
denn nichts anderes referenziert editorController
Wenn ich sie loslasse, verschwindet das Fenster sofort. Ich möchte jedoch, dass der Fenster-Controller losgelassen wird, sobald das Fenster geschlossen ist. In Apples Fenster-Programmieranleitung habe ich Folgendes gelesen:
Wenn Sie möchten, dass das Schließen eines Fensters sowohl das Fenster als auch den Fenster-Controller verschwinden, wenn es nicht Teil eines Dokument ist, muss Ihre Unterklasse von
NSWindowController
kann beobachtenNSWindowWillCloseNotification
oder, da der Fensterdelegierte, implementieren Sie diewindowWillClose:
Methode und umfassen die folgende Codezeile in Ihre Implementierung ein:[self autorelease];
Ich habe die [self autorelease]
en el windowWillClose:
Methode des Fenster-Controllers. Dies funktioniert und führt nicht zu Speicherverlusten. Allerdings fühlt es sich einfach hässlich; addNewItem:
sieht aus, als ob es Speicherverluste gibt, und die statische Analyse sieht das auch so. I wissen, dass es tatsächlich in windowDidClose:
aber es fühlt sich einfach falsch an. Außerdem gibt sich der Window-Controller jetzt selbst frei, ohne sich jemals selbst gehalten zu haben. Das alles verstößt gegen die Regeln der Speicherverwaltung, die ich gelernt habe.
Meine andere Option ist, ein ivar auf dem übergeordneten Controller (entweder ein NSWindowController
oder ein NSMutableSet
de NSWindowController
s) und achten Sie dann auf die NSWindowWillCloseNotification
in der übergeordneten Steuerung und geben sie als Antwort frei. Dies ist sauberer, und ist wahrscheinlich, was ich tun werde. Es ist auch eine ganze Menge mehr Arbeit, obwohl, was mich zu meinen Fragen führt.
Achtet auf die NSWindowDidCloseNotification
die Standardmethode für diese Aufgabe? Was ist die Standardmethode für die Verwaltung NSWindowControllers
die bei Bedarf erstellt und vernichtet werden? Ist die [self autorelease]
die traditionell empfohlene Option, und erst jetzt, da wir statische Analysen haben, ist dies ein Problem?