我使用 VM Tracker 在 Instruments 中运行我的应用程序,发现 Image IO 内存消耗不断增长。
实际上,该应用程序使用initWithContentsOfFile:
. 我曾经读到这种方法是撒旦的产物,所以我将其替换为以下内容:
NSData *data = [NSData dataWithContentsOfFile:path];
UIImage *image = [UIImage imageWithData:data];
这大大减少了虚拟内存(大约 60%),如下图:
但是,为什么 Image IO 虚拟内存会随着时间的推移不断增长,而没有任何泄漏并且我的应用程序只使用 15MB 的实时内存?
我能做些什么来确保这个 Image IO 内存被释放吗?
基本上,从磁盘读取图像是这样完成的:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^(void) {
NSData *data = [NSData dataWithContentsOfFile:path];
UIImage *image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
imageView.image = image;
});
});
我还尝试了以下没有任何重大变化的方法:
[NSData dataWithContentsOfFile:path options:NSDataReadingUncached error:nil]
改为使用- 移动
UIImage *image = [UIImage imageWithData:data];
到主队列 - 在主队列上做所有事情
这让我觉得问题可能出在其他地方。