我在我的某个应用程序中使用了大量的音频,视频和图像,似乎存在轻微的内存问题,并且想知道释放内存的最佳方法是什么。
我使用了很多这样的可选变量:
var myImageView: UIImageView?
我想知道,一旦你知道你不再需要它来释放这样的内存,将它们设置为nil是否被认为是最佳做法:
myImageView = nil
似乎将它设置为nil会删除最后一个强引用并导致它被释放,但如果可能的话,我也不想在XXXX = nil的情况下丢弃我的代码。
我还想过为使用这个变量的类创建一个deinit方法并在那里做这样的:
deinit {
myImageView = nil
}
唯一的事情是我使用的实例在再次使用之前实际上没有被销毁。但通常当一个实例被销毁时,它的所有选项也应该被释放,对吗?
答案 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)
如果您的内存占用太高,您的应用程序可能会被终止,因此如果您使用大量资源,最好尽可能释放内存。
如果您不再需要资源,可以通过设置所有对 nil 的引用来获取其强大的参考资料,从而解除分配。但是,根据您的代码设计,如果您在整个代码中使用相同的资源,请考虑在主对象上使用一个强引用,在其他对象上使用一堆弱引用。它可以避免强大的引用周期,放弃内存,并且每次想要释放内存时都不需要设置对 nil 的引用。只需设置为 nil 您的强力参考。
您还可以在应用中观察内存不足警告,并删除可以重新创建的不必要的资源和资源。您可以通过以下方式访问这些警告:
didReceiveMemoryWarning
方法。UIApplicationDidReceiveMemoryWarningNotification
方法。deinit
通知。 注意:你是对的。当一个实例被销毁时,如果它在另一个地方有一个强引用,那么它们的所有属性都是已释放但不是已取消分配。因此,无需在int width = 16;
int value = 42;
printf("%*d\n", width, value);
方法中将属性设置为 nil 。
有关详细信息,请参阅: