【问题标题】:Releasing strong reference in ARC在 ARC 中发布强引用
【发布时间】:2023-04-07 19:12:01
【问题描述】:

我的项目启用了 ARC。我有一个类是 NSObject 的直接子类,我的类有一个 NSArray(强引用)。如何释放我的数组?

我的理解

  1. 在 ARC 中不需要释放对象

  2. 在 dealloc 方法中将 nil 设置为我的 NSArray(强引用)

  3. 在视图控制器的情况下,在 viewDidUnload 中将我的 NSArray(强引用)设置为 nil

这是释放我的 NSArray 的正确方法吗?如果不是,那么正确的方法是什么?

【问题讨论】:

    标签: ios memory-management automatic-ref-counting


    【解决方案1】:

    首先,viewDidUnload 不再使用,所以这不是一个选项。其次,您不需要在释放类时手动清除类的实例变量,除非它们需要一些特殊的清理。当一个对象被释放时,它会释放其所有实例变量的所有权,因此只要没有其他东西通过强引用指向它们,它们就会自动释放。因此,正如您所问的,正确的方法是什么都不做。一旦您的对象被解除分配,该数组将自行解除分配。

    也就是说,如果你真的想要,你可以像这样清除指向数组的指针:

    myArray = nil;
    

    如果没有其他强引用指向它,这将释放数组,这反过来又会释放数组中没有其他强引用指向它们的任何元素。

    【讨论】:

    • 设置一个指向 nil 的指针不一定会释放它 - arc 可以选择使用自动释放 - AFAIK 它不能保证
    • 是的,无论是发布还是自动发布都不能保证,但无论哪种方式,保留计数最终都会下降(最终)。不过,这是一个很好的建议,谢谢。
    • @Dima 谢谢。 viewdidunload 不会被调用?但是当发生内存警告时, viewdidunload 会被调用吗?那个时候我们应该设置nil吗?
    • 你说,它释放了所有实例变量的所有权,所以只要没有其他东西通过强引用指向它们,它们就会自动释放。这意味着如果任何其他类(除了创建的类)对 myArray 有强引用,那么它就不会被释放?
    • viewDidUnload 在 iOS 6 中已被弃用并且不再被调用。该文档指出“在 iOS 6.0 中已弃用。在内存不足的情况下不再清除视图,因此永远不会调用此方法。”。是的,如果其他人拥有该数组,那么它将不会被释放。这就是引用的工作原理。
    猜你喜欢
    • 2014-09-18
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多