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:
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:
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
?
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.
Tags und Links objective-c cocoa-touch uiviewcontroller