所以我有一个包含UI
ImageView的UIView,它有一个相当大的图像(比如1600×1600).当我加载它时,我可以在
Xcode上看到内存按预期上升但仍然可管理.
现在,如果我myView.removeFromSuperview(),内存不会下降,如果我一直添加和删除其他图像的视图,例如:
>设置图像
>将其添加到视图中
>从superview中删除图像
>设置另一张图片
>将其添加到同一视图中
>回到3并继续循环
在每次迭代之后,我看到内存不断增加,直到最终我的内存不足,收到内存警告并崩溃.
这是预期的吗?当我从superview中删除图像时,不应该释放内存吗?
解决方法
使用
Swift,使用ARC(自动引用计数),无法手动释放内存.内存管理严格委派给操作系统,如果你想提高应用程序的内存性能,唯一的办法就是改进代码本身.
如果你正在处理如此大的图像,那么可能会缩小图像本身的分辨率而不会丢失应用程序上的任何功能.显示此图像时,您还可以实现在主线程上执行的缓存或“实时”压缩,避免使用宝贵的内存来表示像素.有一篇很好的NSHipster文章讨论了在Swift at this link中调整图像大小的不同技术.
// Basic usage of UIGraphicsGetimageFromCurrentimageContext() let yourScaledImage = UIGraphicsGetimageFromCurrentimageContext() UIGraphicsEndImageContext()
UIKit提供了许多用于图像大小调整的高级API,它们直接影响图像在屏幕上的显示方式,因此也适用于主UI线程.
最后,优化在屏幕上表示此大图像的方式,以优化所需的内存量.