2009-04-24 3 views
1

Irgendwo habe ich gelesen, dass ich Speicherprobleme bekommen würde, wenn ich eine Ansicht vorübergehend wegen einer niedrigen Speicherwarnung (Laden wieder, sobald der Benutzer es sehen möchte), wenn die ViewController-Klasse solche Dinge nicht tut an jedem Ausgang dieser Ansicht:Was muss ich in einer Multiview-Anwendung beachten, wenn es um wenig Speicherwarnungen geht?

-(void)dealloc { 
    [myView release], myView = nil; 
    [myLabel release], myLabel = nil; 
    [super dealloc]; 
} 

ich hier bin verwirrt, denn eigentlich dachte ich, dass [myView release] auch die Null-Sache machen würde, zu sagen, dass die Variable mehr kein Objekt hält. Warum zweimal? Oder gibt es etwas, das ich vermisst habe?

Antwort

5

Aufruf [myView release] nicht den Wert von myView ändern, verringert es die Zählung des Objekts behalten, dass myView Punkte (und wenn die Beibehaltungszähler eines Objekts auf Null geht, es dealloc s selbst). Nach dem Aufruf [myView release], myView enthält immer noch die Adresse des View-Objekts, aber wenn myView der einzige Besitzer war, hat dieses Objekt dealloc Ed selbst und der Speicher ist nicht mehr gültig (und mein jetzt durch ein anderes Objekt oder andere Daten belegt werden). Indem Sie myView auf nil setzen, stellen Sie sicher, dass Sie nicht versehentlich den alten Speicher verwenden, der früher zu myView gehörte, und Sie können jetzt testen, ob myView initialisiert oder verworfen wurde.

Beachten Sie, dass Sie nicht brauchen, myView-nil in Ihrem -dealloc Verfahren einzustellen, da Ihre View-Controller wird an diesem Punkt gehen weg wie auch immer, aber Sie würden dies tun wollen, wenn Sie die Ansicht in Reaktion auf einen niedrigen verwerfen Speicherwarnung. Sie können auch den gesamten View-Controller verwerfen, wenn seine Ansicht nicht sichtbar ist.

+0

danke. Im Falle einer niedrigen Speicherwarnung würde ich [myView release] schreiben, myView = nil; direkt in diesem Low-memory warning eventhandler-method? Oder würde self.myView = nil einfach genauso funktionieren? – Thanks

+0

Unter der Annahme, dass myView als beibehalten oder kopieren definiert ist, würde jeder Weg funktionieren. –

0

Wenn ein View-Controller eine Speicherwarnung erhält und die Ansicht nicht angezeigt wird, kann die Eigenschaft view auf null gesetzt werden. Dies wird jedoch keine Unteransichten freigeben, die Sie möglicherweise in anderen Eigenschaften beibehalten. So, hier ist, wie Sie damit umgehen können:

- (void)setView:(UIView *)view 
{ 
    [super setView:view]; 
    if (view == nil) 
    { 
    // Release-and-nil any subviews that you might be retaining. 
    } 
} 
Verwandte Themen