uiview的dealloc 什么时候调用
1个回答
展开全部
最近的一个项目, 基于UINavigationController, 发现个奇怪的问题, 从ViewController (A) push 到ViewController (B) 之后, 发现内存有所增加, 再点左上角的返回按钮回到(A)后, 内存一直在增加, nslog之后发现(B)的viewDidUnload方法根本没有调用, 更别说dealloc, 但viewDidDisappear还是调用了的. google了一番, 终于找到答案:
ht tp:/ /stackoverfl ow.c om/questions/55944 10 /viewdidunload-is-not-getting-called-at-all
As others have mentioned, viewDidUnload is a method of UIViewController. It isn't guaranteed to get called. It only gets called in low memory situations when the app releases the controller's view to free up memory. This gives you an opportunity to release any of the view's subviews that you may have retained as properties of your controller.
If you're calling removeFromSuperview on your view controller's view, then you're probably using UIViewController in a context it wasn't designed to handle. View controllers are designed to manage full-screen views. These views are expected to be presented in just a handful of contexts on the iPhone:
As the full-screen view of the window's root view controller
As a full screen view in a hierarchy of screens managed by UINavigationController
As a full screen view presented within a tab
As a full screen view presented using presentModalViewController:animated:
As long as you're using the view controller in these contexts (plus a couple other contexts on iPad), then you can reliably manage your view's life-cycle via the loadView, viewDidLoad, viewWillAppear:animated:, viewDidAppear:animated:, viewWillDisappear:animated:, and viewDidDisappear:animated:, and viewDidUnload methods (again, bearing in mind that viewDidUnload won't always get called).
The only time you should typically pass a view controller's view to addSubview: is when you add your root view controller's view to the window. If you want to try to use a nested view controller to manage a non-fullscreen subview, you'll have to call its viewWill/DidAppear/Disappear:animated: and viewDidUnload methods manually at appropriate times from your full-screen view's controller.
htt p:/ /stackoverflo w.c om/questions/5124305/iphone-uiviewcontroller-class-dealloc-function-never-called
Interface Builder caches nibs until there's a memory warning, or it exhausts its cache. At such time, it will reclaim any memory that it was using.
于是模拟了一下内存警告, 发现(B)的viewDidUnload方法确实立即被调用了, 如何我push, pop这样来回多次, 当模拟内存警告后, (B)的viewDidUnload方法也会被调用多次, 然而dealloc却还是没有调用.
ht tp:/ /stackoverfl ow.c om/questions/55944 10 /viewdidunload-is-not-getting-called-at-all
As others have mentioned, viewDidUnload is a method of UIViewController. It isn't guaranteed to get called. It only gets called in low memory situations when the app releases the controller's view to free up memory. This gives you an opportunity to release any of the view's subviews that you may have retained as properties of your controller.
If you're calling removeFromSuperview on your view controller's view, then you're probably using UIViewController in a context it wasn't designed to handle. View controllers are designed to manage full-screen views. These views are expected to be presented in just a handful of contexts on the iPhone:
As the full-screen view of the window's root view controller
As a full screen view in a hierarchy of screens managed by UINavigationController
As a full screen view presented within a tab
As a full screen view presented using presentModalViewController:animated:
As long as you're using the view controller in these contexts (plus a couple other contexts on iPad), then you can reliably manage your view's life-cycle via the loadView, viewDidLoad, viewWillAppear:animated:, viewDidAppear:animated:, viewWillDisappear:animated:, and viewDidDisappear:animated:, and viewDidUnload methods (again, bearing in mind that viewDidUnload won't always get called).
The only time you should typically pass a view controller's view to addSubview: is when you add your root view controller's view to the window. If you want to try to use a nested view controller to manage a non-fullscreen subview, you'll have to call its viewWill/DidAppear/Disappear:animated: and viewDidUnload methods manually at appropriate times from your full-screen view's controller.
htt p:/ /stackoverflo w.c om/questions/5124305/iphone-uiviewcontroller-class-dealloc-function-never-called
Interface Builder caches nibs until there's a memory warning, or it exhausts its cache. At such time, it will reclaim any memory that it was using.
于是模拟了一下内存警告, 发现(B)的viewDidUnload方法确实立即被调用了, 如何我push, pop这样来回多次, 当模拟内存警告后, (B)的viewDidUnload方法也会被调用多次, 然而dealloc却还是没有调用.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询