gpt4 book ai didi

ios - 图像IO内存不断增长

转载 作者:可可西里 更新时间:2023-11-01 05:45:04 24 4
gpt4 key购买 nike

我使用 VM Tracker 在 Instruments 中运行我的应用程序,发现图像 IO 内存消耗不断增加。

Instruments with initWithContentsOfFile:

实际上,应用程序使用 initWithContentsOfFile: 从磁盘读取图像。我曾经读到这个方法是撒旦的产物,所以我用下面的方法替换它:

NSData *data = [NSData dataWithContentsOfFile:path];
UIImage *image = [UIImage imageWithData:data];

这大大减少了虚拟内存(大约 60%),如下所示:

Instruments with imageWithData:

但是,当没有任何泄漏并且我的应用程序仅使用 15MB 的实时内存时,为什么图像 IO 虚拟内存会随着时间的推移而不断增长?

我可以做些什么来确保释放这个图像 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]; 到主队列
  • 在主队列上做所有事情

这让我觉得问题可能出在其他地方。

最佳答案

您至少应该将后台处理包装到一个自动释放池中:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^(void) {
@autoreleasepool {
NSData *data = [NSData dataWithContentsOfFile:path];
UIImage *image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
imageView.image = image;
});
}
});

通过这种方式,您可以确保后台线程上的所有自动释放对象尽快消失。

关于ios - 图像IO内存不断增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18256107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com