0

我在我的视图控制器中加载了很多相当大的图像,使用

NSUInteger nimages = 0;

for (; ; nimages++) {

    NSString *nameOfImage_ = @"someName";

    NSString *imageName = [NSString stringWithFormat:@"%@%d.jpg", nameOfImage_, (nimages + 1)];

    image = [UIImage imageNamed:imageName];
    if (image == nil) {
        break;
    }

    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

    //some other stuff....

    [imageView release];
}

通常的卸载发生在 - (void)viewDidUnload 和 - (void)dealloc with self.image = nil; 和[图像发布];

似乎经过几次“加载”和“卸载”后,缓存仍然增长到不归路!:)

和应用程序崩溃...

有任何想法吗???我如何清空我的缓存?在哪里?

谢谢

编辑:

好的,这就是我做错了。显然,这段代码修复了整个缓存问题:

image = [[UIImage imageNamed:imageName] autorelease];

自动释放是这里的关键。

感谢您的回复...

4

5 回答 5

4

谢谢大家的建议。

解决方案:
使用ARCimageWithContentsOffFile来初始化图像。

image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:imageName ofType:nil]];

的,只imageNamed对……没什么大不了的……

于 2012-05-23T09:27:57.253 回答
3
image = [[UIImage imageNamed:imageName] autorelease];

这是不正确的。根据内存管理规则,您不应该释放(或自动释放)图像,因为您没有分配或保留它。“imageNamed”不包含“alloc”、“new”、“copy”或“retain”。

正如其他一些答案所解释的那样,如果您想更好地控制它们使用的内存,则应该使用不同的方法加载图像。

于 2012-05-22T21:28:05.827 回答
1

imageNamed在现实中加载图像是一种糟糕的方式,它永远不会释放加载的图像,除非被迫并将它们永久保存在缓存中。您应该实现自己的更智能的缓存。一个简单NSMutableDictionary的提供相同的功能,但具有更大的灵活性。

如需更深入的讨论,您可以阅读以下内容:http ://www.alexcurylo.com/blog/2009/01/13/imagenamed-is-evil/

于 2012-05-22T15:28:08.517 回答
0

您可以使用 imageWithContentsOfFile 代替使用 imageNamed:或者查看这篇文章

链接 0

链接 1

于 2012-05-22T15:30:26.783 回答
0

使用另一种方法来初始化您的图像。imageNamed缓存。

于 2012-05-22T15:28:31.797 回答