【问题标题】:iPhone view loaded many times... but never unloaded?iPhone视图加载了很多次......但从未卸载?
【发布时间】:2010-11-29 18:09:20
【问题描述】:

我的 iPhone 应用程序基于一个常见的“实用程序模板”,例如 Apple 自己的天气应用程序。

我点击信息按钮,它会翻转屏幕。我点击我的完成按钮......它会翻转回来。这部分似乎一切正常。

我已将 NSLog() 语句放入 FlipSideViewController.m 中的 4 个方法中的每一个中

viewDidLoad
viewWillAppear
viewDidUnload
viewWillDisappear

当我翻转到 FlipSide 时,我不应该看到 viewDidLoad 和 viewDidAppear 被调用吗? 然后在我翻转的时候看到viewWillDisappear和viewDidUnload?

相反,我从未见过任何 viewDidUnload 调用。但每次我翻转到我的 FlipSide 时,我都会看到另一个 viewDidLoad。错了吗?

来回翻转,一次又一次,我会看到:

viewDidLoad
viewWillAppear
viewWillDisappear

viewDidLoad
viewWillAppear
viewWillDisappear

viewDidLoad
viewWillAppear
viewWillDisappear

这是否意味着视图重新加载了 3 次......但卸载了 0 次? 这里不应该有“匹配”的加载/卸载和出现/消失方法吗?

【问题讨论】:

  • 你能贴出你的翻转效果的代码吗?我认为您没有按照应有的方式删除视图。

标签: iphone objective-c viewdidload viewwillappear


【解决方案1】:

一开始我也是这么想的,但显然不是这样的。

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 方法中,您只需释放应该与视图一起卸载的内容,通常是您在界面构建器中连接到IBOutlets 的内容。

- (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;
}

【讨论】:

  • 值得注意的是,重用 same 视图控制器(即不释放它)将导致更频繁地调用viewDidUnload,因为视图控制器本身仍将存在,但视图可能不在屏幕上(因此应用程序可以卸载它)。
  • 那么我的代码在 viewDidUnload... 中应该是什么样子,然后在 dealloc... 中正确释放? (另外,我不会发布已经发布的东西吗?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多