【问题标题】:Swift 2.2 memory managementSwift 2.2 内存管理
【发布时间】:2016-10-19 13:36:26
【问题描述】:

所以我有一个 UIView,其中包含一个带有相当大图像(比如 1600x1600)的 UIImageView。当我加载它时,我可以在 Xcode 上看到内存按预期增加但仍然可以管理。

现在,如果我 myView.removeFromSuperview() 内存没有下降,并且如果我继续一次添加和删除带有其他图像的视图,则类似于:

  1. 设置图片
  2. 将其添加到视图中
  3. 从超级视图中删除图像
  4. 设置另一张图片
  5. 将其添加到同一视图中
  6. 回到 3 并继续循环

每次迭代后,我都会看到内存不断增加,直到最终内存不足,收到内存警告并崩溃。

这是预期的吗?从superview中删除图像时不应该释放内存吗?

【问题讨论】:

  • 你应该提供一些代码来显示你到底在做什么。如果您持有对该视图的引用,则 removeFromSuperview 不会释放您的视图对象。
  • 向我们展示您的代码。
  • 看看这个UIImage cache 当你使用 UIImage(named:_) 它会缓存图像。这可能不是你想要的。

标签: ios xcode swift memory-management


【解决方案1】:

使用 Swift,使用 ARC(自动引用计数),无法手动释放内存。 内存管理严格委托给操作系统,如果您想提高应用程序的内存性能,唯一的方法就是改进代码本身。

如果您正在处理如此大的图像,则可能缩小图像本身的分辨率,而不会丢失应用程序的任何功能。显示此图像时,您还可以实现在主线程上执行的 缓存 或“实时”压缩,避免使用宝贵的内存来表示像素。有一篇很好的 NSHipster 文章讨论了在 Swift at this link 中调整图像大小的不同技术。

// Basic usage of UIGraphicsGetImageFromCurrentImageContext()
let yourScaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

UIKit 提供了许多用于调整图像大小的高级 API,这些 API 直接作用于图像在屏幕上的显示方式,因此也作用于主 UI 线程。

总之,优化您在屏幕上呈现这个大图像的方式,以优化所需的内存量。

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多