iPhone视图加载多次......但从未卸载?

时间:2010-11-29 18:09:21

标签: iphone objective-c viewdidload viewwillappear

我的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次? 不应该有“匹配”加载/卸载和出现/消失方法吗?

1 个答案:

答案 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;
}