ios - UIImageView.animationImages 后如何清除内存?
问题描述
我创建了一个新的 Xcode 项目,它只有以下内容:
- 从 png 拖入项目中创建 UIImages 数组的代码(我在将图像附加到数组时尝试了 UIImage(named:) 和 UIImage(contentsOfFile:) )
- 一个 UIImageView
- 设置 imageView.animationImages = arrayOfImages 并调用 imageView.startAnimating() 的按钮
当按下按钮并播放动画时,内存使用量会增加 150-200MB,具体取决于图像数组中的图像数量。然后内存使用量保持在该水平。
设置 imageView.animationImages = nil 不会清除内存。我该如何清除那段记忆?
任何的意见都将会有帮助。谢谢!
解决方案
1.不要隐式缓存图像
我猜你正在使用 UIImage(named:)?
该方法缓存图片,见: https ://developer.apple.com/documentation/uikit/uiimage/1624146-init
苹果建议:
如果您有一个只显示一次的图像文件并希望确保它不会被添加到系统的缓存中,您应该使用 imageWithContentsOfFile: 创建您的图像。这将使您的一次性图像远离系统图像缓存,从而可能改善您的应用程序的内存使用特性。
所以使用 'UIImage(contentsOfFile: String)' 应该可以解决你的问题。由于您需要提供图像路径的文档,图像名称是不够的,请参见此处:
https://developer.apple.com/documentation/uikit/uiimage/1624123-imagewithcontentsofile
那里还提到:
此方法不缓存图像对象。
2.不要持有对图像的引用
当您将图像加载到本地数组中时,请确保将其清空。
self.imageArray = []
3. 将 imageView.animationImages 设置为空数组
self.imageArray = []
self.imageView.animationImages = self.imageArray
快速验证 Instruments 中的分配:
如您所见,内存已被回收。都好。
推荐阅读
- perforce - Perforce,“需要解决”消息是否总是暗示未决的更改?
- resize - 带有“桌面”类型提示的可移动 GtkWindow
- c - 没有从 C 程序获得预期的输出
- node.js - 使用 GeoFire 按半径查询位置
- r - 如何为R中数据集的每一行打印箱线图?
- docker - Unhealthy 与 Degraded .NET 健康检查状态有什么区别
- python - 使用子查询注释计数
- android - 对话框中的 GraphView 不起作用 - logcat 中的错误
- drupal - 单击事件链接时,在日历旁边的块中显示事件信息
- python - 带有 urlopen(..net/cé..) 的 UnicodeEncodeError