我的iPhone应用程序基于一个常见的“实用工具模板”,如Apple自己的天气应用程序。
我点击信息按钮,它会翻转屏幕。我点击完成按钮......然后它翻转。这一部分似乎都运转正常。
我已经在我的FlipSideViewController.m中的4个方法中的每个方法中放置了NSLog()语句
viewDidLoad
viewWillAppear
viewDidUnload
viewWillDisappear
当我翻转我的FlipSide时,我不应该看到调用viewDidLoad和viewDidAppear。 当我翻回时看到viewWillDisappear和viewDidUnload?
相反,我从未看到任何viewDidUnload调用。但每次我翻转我的FlipSide时,我都会看到另一个viewDidLoad。这是错的吗?
一次又一次地来回翻转,我会看到:
viewDidLoad
viewWillAppear
viewWillDisappear
viewDidLoad
viewWillAppear
viewWillDisappear
viewDidLoad
viewWillAppear
viewWillDisappear
这是不是意味着视图重新加载了3次......但是卸载了0次? 不应该有“匹配”加载/卸载和出现/消失方法吗?
答案 0 :(得分:7)
起初我也这么认为,但显然事实并非如此。
viewDidUnload
方法实际上只在视图控制器收到内存警告时被调用。
但是,当视图控制器被解除分配时,视图将被释放。
所以,如果你在viewDidUnload
发布像IB网点这样的东西,这很好,但是你也必须在dealloc
中发布它们,因为viewDidUnload
不会被调用正常情况(即,如果你没有得到记忆警告)。
编辑:
要释放view
,您只需要在dealloc
中的超级UIViewController
上致电dealloc
:
- (void) dealloc
{
// release your stuff, anything that you alloc or retain in your class
// then call `dealloc` on the super class:
[super dealloc];
}
在viewDidUnload
方法中,您只需要发布应与视图一起卸载的内容,通常是您在界面构建器中连接到IBOutlet
的内容。
- (void) viewDidUnload
{
// if the property was declared with the "retain" keyword, you can
// release it simply by setting it to nil like this:
self.myOutlet = nil;
}