我在我的视图控制器中加载了许多相当大的图像,使用
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];
}通常的卸载发生在-(空)viewDidUnload和-(空)dealloc中,self.image = nil;以及镜像释放;
似乎在几次“加载”和“卸载”之后,缓存仍然增长到不能返回的地步!!:)
然后应用程序就崩溃了。
有什么想法吗?如何清空缓存?在哪里呢?
谢谢
编辑:
好了,这就是我做错的地方。显然,这段代码解决了整个缓存问题:
image = [[UIImage imageNamed:imageName] autorelease];自动释放是这里的关键。
感谢你的回复...
发布于 2012-05-23 17:27:57
感谢大家的建议。
解决方案:
已使用ARC和imageWithContentsOffFile初始化图像。
image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:imageName ofType:nil]];是的,imageNamed只适用于...好吧没什么大不了的..。
发布于 2012-05-23 05:28:06
image = [[UIImage imageNamed:imageName] autorelease];这是不正确的。为了与内存管理规则保持一致,您不应该释放(或自动释放)映像,因为您没有分配或保留它。"imageNamed“不包含"alloc”、"new“、"copy”或"retain“。
正如其他一些答案所解释的那样,如果您希望更多地控制图像所使用的内存,则应该使用不同的方法加载图像。
发布于 2012-05-22 23:28:09
在现实中,imageNamed是一种糟糕的加载图像的方式,它从不释放加载的图像,除非是强制的,并将它们永久保存在缓存中。你应该实现你自己的,更智能的缓存。一个简单的NSMutableDictionary提供了相同的功能,但具有更大的灵活性。
有关更深入的讨论,请阅读以下内容:http://www.alexcurylo.com/blog/2009/01/13/imagenamed-is-evil/
https://stackoverflow.com/questions/10705104
复制相似问题