IOS上的图像缓存

IOS上的图像缓存,ios,objective-c,memory,allocation,Ios,Objective C,Memory,Allocation,我的应用程序内存有问题。我检查了仪器以获得更多关于这个问题的线索,我发现79%的内存都被这个问题占用了: 所以我在谷歌上搜索过,有人说这是图像缓存,它将我所有的图像保存在内存中。也许是我分配的 以下是我如何称呼我的图像: info = [InfoModel getInfo:[NSString stringWithFormat:@"%d", self.idEnigme]]; myImage = [UIImage imageNamed:[NSString stringWithFormat

我的应用程序内存有问题。我检查了仪器以获得更多关于这个问题的线索,我发现79%的内存都被这个问题占用了:

所以我在谷歌上搜索过,有人说这是图像缓存,它将我所有的图像保存在内存中。也许是我分配的

以下是我如何称呼我的图像:

info = [InfoModel getInfo:[NSString stringWithFormat:@"%d", self.idEnigme]];

    myImage = [UIImage imageNamed:[NSString stringWithFormat:@"res/img/%@", [info objectForKey:@"path1"]]];
    myImageView = [[UIImageView alloc] initWithImage:myImage];

    myImageView.frame = CGRectMake(0, 200, [[UIScreen mainScreen] bounds].size.width, 400);

    [self.scrollView addSubview:myImageView];
Info是一个类,我在其中解析一个Json文件,其中是我的图像路径


谢谢你的帮助,这让我发疯

iOS会在您调用
ImageName:

正如在几个地方所讨论的,包括:

如果您知道只需要使用创建一次缓存,就可以绕过此缓存

[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:nil]]

相反

我不太担心,当应用程序收到内存不足警告时,UIImage缓存将被清除。这一切都是自动处理的,因此任何不再使用的图像都将在此时从内存中刷新

因此,如果您的应用程序因内存不足而崩溃,则不太可能,因为操作系统正在缓存不再使用的图像


您可以通过使用initWithData而不是imageNamed来处理自己的图像缓存,但我怀疑这个解决方案是否会对您有所帮助。

我非常担心下面的屏幕。当我在分配模式下启动“Instruments”时,我看到我的应用程序的每个图像都添加到了“Living”中。我真的不明白怎么可能

我发现了问题并解决了它。我会告诉你问题出在哪里,也许这能帮到别人

真正的问题是我的UIImage初始化。最初,我在方法中分配UIImage,如下代码所示:

NSString* fileName = [NSString stringWithFormat:@"%@%@%@", name, number, ext];
            UIImage *myImageHeader = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:nil]];
            UIImageView *myImageViewHeader = [[UIImageView alloc] initWithImage:myImageHeader];

            myImageViewHeader.frame = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, 277);

            [self.scrollView addSubview:myImageViewHeader];
最后,我决定通过属性在my.h中创建UIImageview,并在我的方法中设置它,如下所示:

#.h
@property (weak, nonatomic) IBOutlet UIImageView *headerImage;

#.m
[self.headerImage setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:nil inDirectory:nil]]];
这样我节省了很多内存,但仍然有漏洞。因此,我决定在使用后删除UIImageView中的图像:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^(void){
            self.headerImage.image = nil;
        });
现在,我的应用程序只使用8mb内存,并正确管理内存


谢谢你的帮助

当我使用
UIImage imageWithContentsOfFile:
而不是
imageNamed
时,我的图像不再显示…你必须将文件路径而不是文件名传递给它,我将编辑我的AnseWrite作品。我会在我的应用程序的每一张图片上进行测试,并发布我的反馈。这意味着你还有其他一般性的内存问题。我建议您执行堆快照分析。查看和搜索堆快照我已经用imageWithContentsOfFile尝试过类似的方法,但它并没有解决我的问题。你知道它从哪里来吗?看看有生命的物体,从右上角打开仪器的右面板。查看调用堆栈,看看是否正确地释放了图像