Ist es innerhalb eines View-Controllers erforderlich, removeFromSuperview auf Subviews während viewDidUnload aufzurufen?

8

Viele Leute sagen, während der Methode viewDidUnload eines View-Controllers müssen Sie Subviews entfernen, indem Sie die Methode removeFromSuperview aufrufen. Zum Beispiel macht Three20 so etwas:

%Vor%

Ich verstehe die Gründe dafür: Wenn Sie [self.view addSubview:_aView] in loadView aufrufen, sollten Sie [_aView removeFromSuperview] in viewDidUnload aufrufen. Die Sache ist, das scheint nicht notwendig. Wenn die View-Controller-Ansicht freigegeben wird, gibt ihre Dealloc-Methode automatisch alle ihre Subviews frei. Mein Testcode zeigt an, dass Subviews automatisch freigegeben werden, wenn ihre Superview freigegeben wird:

%Vor%

Der obige Code erzeugt die folgende Ausgabe:

%Vor%

Wie Sie sehen, werden die Unteransichten des View-Controllers freigegeben, wenn die Hauptansicht des View-Controllers freigegeben wird.

Auch die iOS-Entwicklerbibliothek [gibt an] (http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html#//apple_ref/doc/uid/TP40007457-CH101- SW4 ): "Im Falle einer Bedingung mit wenig Arbeitsspeicher ist das Standardverhalten von UIViewController das Freigeben des in der Ansichtseigenschaft gespeicherten Ansichtsobjekts, wenn diese Ansicht derzeit nicht verwendet wird." Außerdem: "Wenn Sie eine deklarierte Eigenschaft verwenden, um einen Verweis auf Ihre Ansicht zu speichern, und diese Eigenschaft Retain-Semantik verwendet, reicht die Zuweisung eines Nullwerts aus, um die Ansicht freizugeben."

Wenn also die Freigabe einer Ansicht automatisch ihre Unteransicht freigibt, ist es wirklich notwendig, removeFromSuperview während viewDidUnload ?

aufzurufen     
David H 10.06.2011, 09:06
quelle

2 Antworten

3

Nein, das ist nicht notwendig, die Dealloc, wie Sie ganz richtig gesagt haben, wird das für Sie tun :) (langer Post, kurze Antwort).

    
Simon Lee 10.06.2011, 09:26
quelle
1

Ich fand es in meinem Projekt notwendig. Meine viewController hat eine Hauptansicht (wie sie alle) und in diesem Fall ist es mit einem Xib (nicht programmgesteuert zugeordnet und als Unteransicht hinzugefügt) definiert. Diese Ansicht enthält Unteransichten mit IBOutlets im View-Controller. Wenn ich in viewDidUnload die IBOutlet-Eigenschaften einfach auf nil (self.mySubView = nil) setze, wird dealloc für diese Unteransicht nicht aufgerufen. Wenn ich es zuerst aus seiner Superansicht (der Hauptansicht) entferne, wird Dealloc aufgerufen.

    
svenyonson 16.05.2012 19:53
quelle