【问题标题】:In Swift should I set my optional instance variables to nil when done?在 Swift 中,我应该在完成后将我的可选实例变量设置为 nil 吗?
【发布时间】:2016-02-17 17:16:59
【问题描述】:

我在我的一个应用程序中使用了大量的音频、视频和图像,并且似乎有轻微的内存问题,我想知道释放内存的最佳方法是什么。

我使用了很多这样的可选变量:

var myImageView: UIImageView?

我想知道是否将这些设置为 nil 是最佳做法,一旦您知道不再需要它来释放内存,如下所示:

myImageView = nil

似乎将它设置为 nil 会删除最后一个强引用并导致它被释放,但如果可能的话,我也不想在我的代码中到处乱扔 XXXX = nil。

我还考虑为使用该变量的类创建一个 deinit 方法,并在其中执行如下操作:

deinit {
    myImageView = nil
}

唯一的问题是我正在使用的实例在再次使用之前实际上并没有被销毁。但是通常当一个实例被销毁时,它的所有可选项也应该被释放,对吧?

【问题讨论】:

    标签: ios swift memory memory-management optional


    【解决方案1】:

    来自 Apple 关于自动引用计数 (ARC) 的 documentation,他们说:

    Swift 使用自动引用计数 (ARC) 来跟踪和管理应用的内存使用情况。在大多数情况下,这意味着内存管理在 Swift 中“正常工作”,您不需要自己考虑内存管理。当不再需要类实例时,ARC 会自动释放这些实例使用的内存。

    你觉得下面的部分很有趣

    但是,在少数情况下,ARC 需要有关 代码部分之间的关​​系,以便管理内存 你。

    你还没有发布任何代码,所以我不知道你是否有弱引用、无主引用、闭包的强引用循环等。

    例如,如果您有一个强大的闭包参考周期,如上面的文档链接中所述:

    当您使用类类型的属性时,Swift 提供了两种解决强引用循环的方法:弱引用和无主引用。

    我认为阅读文档会对您有所帮助,因为它会让您清楚地了解 ARC 在 Swift 中的工作原理。

    【讨论】:

      【解决方案2】:

      Apple 鼓励您使用尽可能少的内存。通过这样做,系统可以将更多应用程序保留在内存中,并将内存分配给真正需要它的应用程序。为此,您可以使用以下策略:

      减少内存占用

      如果您的内存占用过多,您的应用程序可能会被终止,因此如果您使用大量资源,最好尽可能释放内存。

      如果您不再需要某个资源,您可以通过将 all 引用设置为 nil 来摆脱它的强引用,从而释放它。但是,根据您的代码设计,如果您在整个代码中使用相同的资源,请考虑在主要对象上使用一个强引用并在其他对象上使用一堆 引用。它可以避免强引用循环、废弃内存,并且您不需要在每次想要释放内存时都将引用设置为 nil。只需将您的强参考设置为 nil

      内存警告

      您还可以在应用中观察到内存不足警告,并删除不必要的资源和可以重新创建的资源。您可以通过以下方式访问这些警告:

      • 应用委托中的applicationDidReceiveMemoryWarning 方法。
      • didReceiveMemoryWarning 视图控制器中的方法。
      • UIApplicationDidReceiveMemoryWarningNotification 通知。

      注意:你是对的。当一个实例被销毁时,它们的所有属性都释放,但如果它在另一个地方有强引用,则不会释放。所以无需在deinit 方法中将属性设置为nil

      有关详细信息,请参阅:

      【讨论】:

        【解决方案3】:

        Optional 是一种有意义地使用数据类型的方法。

        例如,您有一个名为 age 的变量。仅仅因为用户没有为该变量指定值,您就不能将其值设为零,这是荒谬的。

        所以,可选只是意味着它接受一个 nil 值,这就是为什么我们在使用它之前打开可选变量,以确保它是否有值。

        内存管理由 iOS 通过 ARC 处理。您面临的内存问题可能是由于保留周期。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-04
          • 1970-01-01
          • 2021-04-08
          相关资源
          最近更新 更多