我在Instruments中使用VM Tracker运行我的应用程序,并发现了不断增长的Image IO内存消耗。
实际上,该应用程序从磁盘读取了大量图像,使用了initWithContentsOfFile:
方法。我曾经听说这个方法是“撒旦的产物”,所以我将它替换为以下方法:
NSData *data = [NSData dataWithContentsOfFile:path];
UIImage *image = [UIImage imageWithData:data];
这样做大大减少了虚拟内存(约60%),如下所示:
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];
移至主队列上执行 - 所有操作都在主队列上执行
这让我认为问题可能出现在其他地方。