在Swift中,我应该在完成后将可选实例变量设置为nil吗?

时间:2016-02-17 17:17:00

标签: ios swift memory memory-management optional

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

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

var myImageView: UIImageView?

我想知道,一旦你知道你不再需要它来释放这样的内存,将它们设置为nil是否被认为是最佳做法:

myImageView = nil

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

我还想过为使用这个变量的类创建一个deinit方法并在那里做这样的:

deinit {
    myImageView = nil
}

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

3 个答案:

答案 0 :(得分:6)

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

  

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

以下部分对您来说很有意思

  

然而,在少数情况下,ARC需要更多关于此的信息   代码部分之间的关​​系,以便管理内存   你。

您还没有发布任何代码,因此我无法知道您是否有弱引用,无主参考,封闭的强引用周期等。

例如,如果您有一个强大的关闭引用循环,如上面的文档链接所述:

  

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

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

答案 1 :(得分:1)

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

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

因此,optionals只是意味着它接受一个nil值,这就是为什么我们在使用它的值时强制解包选项,告诉它的值是nomore nil。

内存管理由iOS通过ARC处理。

答案 2 :(得分:1)

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

减少内存占用

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

如果您不再需要资源,可以通过设置所有 nil 的引用来获取其强大的参考资料,从而解除分配。但是,根据您的代码设计,如果您在整个代码中使用相同的资源,请考虑在主对象上使用一个强引用,在其他对象上使用一堆引用。它可以避免强大的引用周期,放弃内存,并且每次想要释放内存时都不需要设置对 nil 的引用。只需设置为 nil 您的强力参考。

内存警告

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

    app delegate中的
  • didReceiveMemoryWarning方法。
  • 视图控制器中的
  • UIApplicationDidReceiveMemoryWarningNotification方法。
  • deinit通知。

注意:你是对的。当一个实例被销毁时,如果它在另一个地方有一个强引用,那么它们的所有属性都是已释放但不是已取消分配。因此,无需在int width = 16; int value = 42; printf("%*d\n", width, value); 方法中将属性设置为 nil

有关详细信息,请参阅:

相关问题