所以我有一个 UIView,其中包含一个带有相当大图像(比如 1600x1600)的 UIImageView。当我加载它时,我可以在 Xcode 上看到内存按预期增加但仍然可以管理。
现在,如果我 myView.removeFromSuperview()
内存不会下降,如果我继续一次添加和删除带有其他图像的 View ,例如:
- 设置图片
- 将其添加到 View 中
- 从父 View 中删除图像
- 设置另一张图片
- 将其添加到同一 View
- 回到3继续循环
在每次迭代后,我看到内存不断增加,直到我最终耗尽内存,收到内存警告并崩溃。
这是预期的吗?当我从 superview 中删除图像时,内存不应该被释放吗?
最佳答案
在 Swift 中,使用 ARC(自动引用计数),手动释放内存是不可能的。 内存管理 严格委托(delegate)给操作系统,如果您想提高应用的内存性能,唯一的方法就是改进代码本身。
如果您要处理如此大的图像,则有可能缩小图像本身的分辨率,而不会丢失应用程序的任何功能。显示此图像时,您还可以实现在主线程上执行的缓存 或“实时”压缩,从而避免使用宝贵的内存来表示像素。有一篇很好的 NSHipster 文章讨论了在 Swift 中调整图像大小的不同技术 at this link .
// Basic usage of UIGraphicsGetImageFromCurrentImageContext()
let yourScaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
UIKit 提供了许多用于调整图像大小的高级 API,这些 API 直接作用于图像在屏幕上的显示方式,因此作用于主 UI 线程。
总而言之,优化您在屏幕上表示此大图像的方式,以优化所需的内存量。
关于ios - Swift 2.2 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37886231/