【问题标题】:How to properly compose a "viewDidLoad" method如何正确编写“viewDidLoad”方法
【发布时间】:2011-05-09 10:29:06
【问题描述】:

我对 iPhone 开发并不完全陌生,但我遇到了一种情况,我不确定我的代码的最佳设计选择。

我有一个视图控制器,它异步地从 Internet 获取图像并将其加载到图像视图中。但是,当应用收到内存警告时,didReceiveMemoryWarning 会释放 imageView。如果应用在加载图像时收到内存警告,则当我的代码尝试将图像加载到 imageView 时,imageView 为 nil。

viewDidLoad 的最佳做法是什么?我应该只实例化以后可能需要的任何变量吗?还是应该只检查代码中其他地方的 nil 值?

另外,在 viewDidUnload 中,我应该将 IBOutlet 变量设置为 nil 吗?这是为什么呢?

谢谢! -马特

【问题讨论】:

  • 这不是这个问题的直接答案,但也许你应该在内存警告中取消下载操作......

标签: iphone null viewdidload memory-management


【解决方案1】:

为什么不在加载图像时按需创建图像视图?无需更早地创建它。或者,如果您这样做了,那么如果它已发布,则只需使用代码重新创建它。

在 viewdidunload 中,您应该释放在 viewdidload(或加载视图)中创建的资源。包括界面构建器为您连接的任何 IBoutlets。将这些变量设置为 nil 是一种很好的做法,以确保它们在发布后不会被无意访问,或者双重发布。

【讨论】:

    【解决方案2】:
    1. IBOutlets 可以是实例变量和属性。在这两种情况下,我们都应该在视图(最顶层的超级视图)被卸载时释放引用。将 IBOutlet 保留属性设置为 nil 会自动释放引用,但对于实例变量,我们需要释放它们。我们仍然需要将实例变量设置为 nil,因为 viewDidUnload 不是 dealloc,因此我们必须遵守托管内存规则,否则我们可能会在实例内部存在无效引用。

    2. 我认为没有关于在 viewDidLoad 中应该做什么的规则,但是如果你确实在 viewDidUnload 中释放并设置了一些变量为 nil,你不需要在 viewDidLoad 中再次检查 nil,除非你不要相信框架。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2012-02-19
      • 2013-10-17
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多