【问题标题】:Significance/Need of setting the properties to nil in viewDidUnload在 viewDidUnload 中将属性设置为 nil 的意义/需要
【发布时间】:2012-09-09 16:07:43
【问题描述】:
  • viewDidUnload 中将属性设置为nil 在两个方面(即使用ARC 或不使用ARC)有什么意义?
  • 是否只在IBOulets 的情况下重要?我们不需要将其他属性(不是IBOulets)设置为nil吗?
  • 如果我不这样做会有什么后果?我之前没有设置它们nil,也没有观察到任何后果。

非常感谢您的帮助。

【问题讨论】:

标签: iphone memory-management properties null significance


【解决方案1】:

在 viewDidUnload 中将 IBOutlets 设置为 nil 会告诉编译器在内存警告时释放出口。因为在内存警告时 ..viewDidUnload 和视图控制器的 didReceiveMemoryWarning 会被调用。通常在 ViewDidUnload 中 IBOutlets 设置为 nil 并且在 didReceiveMemoryWarning 属性中或对象被释放。因此在这种情况下,内存被重新获得,因此您的应用程序可以继续运行,否则由于内存不足,连续池会导致崩溃

【讨论】:

  • 你的意思是跟ARC没什么关系吗?
  • 如果您已将 IBOutlet 的属性声明为 retain 或(ARC 中为强),则需要在 viewDidUnload 中释放它。但如果分配给 IBOutlet 的属性为 assign 或(ARC 中为弱),那么就不需要将 outlet 设置为 nil
【解决方案2】:

在网上阅读了很多文章并在 stackoverflow.com 上解决了类似的问题后,我得出了以下理解:

  • viewDidUnload 在内存不足的情况下由编译器调用。

  • 我们应该在方法中将这些属性设置为 nil,这些属性将在 viewDidLoad 中重新实例化。几乎所有 IBOutlet 组件都属于该类别。所以我们最好在方法中将 IBOutlets 声明为 nil。不这样做会导致持续池化,并且将来可能会因内存不足而导致崩溃(该时间,应用程序继续运行)。

  • 我还读到我们不应该将 NSString 之类的类实例设为 nil(可能导致崩溃),根据我的经验,这是正确的。但原因我不知道。

  • 它与 ARC 无关。将属性设置为 nil 仅意味着该属性不再保留任何内存位置的引用。

每次我对它有更多了解时,我都会继续更新这个答案。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多