0

Ich bin ziemlich neu in der Programmierung für iOS und habe ein Problem mit einer iPad-App, die ich gerade entwickle. Ich verwende einen Splitview-Controller, um jedes Mal, wenn eine Zelle in der Rootview der Splitview angetippt wird, der Detailansicht der Splitview eine Unteransicht hinzuzufügen. Dies ist in Ordnung, bis der Stack zu hoch wird und ich nicht mehr genügend Speicher habe. Wie kann ich die vorherige Unteransicht freigeben, nachdem die neue Ansicht dem Stapel hinzugefügt wurde? Oder gibt es einen besseren Weg, dieses Problem zu lösen?Unteransichten freigeben

Dank

Antwort

0

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.

Verwandte Themen