Um eine Ansicht von seinem Super zu entfernen:
[view removeFromSuperview];
Der Super wird die Sicht freizugeben diesem Punkt an. Wenn also die Superansicht der einzige Akteur mit einer eigenen Referenz ist, wird die Ansicht freigegeben. Um es anders auszudrücken:
[superview addSubview:view];
bewirkt, dass Superview Ansicht erhalten bleibt. So sehen Sie oft Code-Blöcke wie:
view = [[ViewClass alloc] initWithFrame:frame]; // I own view
[superview addSubview:view]; // superview and I both own view
[view release]; // now only superview owns view;
// it'll be deallocated if
// superview ever relinquishes
// ownership
So haben Sie jetzt einen Zeiger zu sehen, dass so lange gültig, wie der Blick in der Super bleibt. So ist es in der Folge sicher, removeFromSuperview
zu post, aber danach ist die Verwendung der Ansicht explizit unsicher. Das View-Objekt wird nur zwischen alloc/init und removeFromSuperview bestehen. Es wird freigegeben, wenn es entfernt wird.
Per normalen Cocoa Referenzzählung Regeln, ist die folgende ziemlich das gleiche wie ein Drop-in-Ersatz für eine alloc/init und einer anschließenden Freigabe:
view = [ViewClass viewWithFrame:frame]; // view is an autoreleased object;
// the autorelease pool owns it
[superview addSubview:view]; // superview now owns view also
// the autorelease pool will relinquish ownership automatically, in the future...
Wenn Sie nichts manuell getan haben Auswirkungen auf das Verhalten, da es sich nur um den normalen Runloop handelt, sind die Dinge im Autorelease-Pool für die Lebensdauer des aktuellen Aufruf-Stacks sicher. In diesem Fall würden Sie die Ansicht genau so behandeln, wie Sie es im manuellen alloc/init-Beispiel getan haben. Möglicherweise haben Sie die Änderung nur vorgenommen, um eine Codezeile zu speichern und die Speicherverwaltung implizit zu belassen.