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

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

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

var myImageView: UIImageView? 

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

 myImageView = nil 

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

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

 deinit { myImageView = nil } 

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

从Apple关于自动参考计数(ARC)的文档中 ,他们说:

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

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

但是,在少数情况下,ARC需要有关代码部分之间关系的更多信息,以便为您管理内存。

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

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

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

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

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

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

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

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

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

减少内存占用

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

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

内存警告

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

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

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

有关更多信息,请参阅:

  • 自动参考计数
  • 在Performance Tips中 有效使用Memory