首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存管理UIImage ImageNamed

内存管理UIImage ImageNamed
EN

Stack Overflow用户
提问于 2012-05-22 23:25:15
回答 5查看 2.9K关注 0票数 0

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

代码语言:javascript
复制
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;以及镜像释放;

似乎在几次“加载”和“卸载”之后,缓存仍然增长到不能返回的地步!!:)

然后应用程序就崩溃了。

有什么想法吗?如何清空缓存?在哪里呢?

谢谢

编辑:

好了,这就是我做错的地方。显然,这段代码解决了整个缓存问题:

代码语言:javascript
复制
image = [[UIImage imageNamed:imageName] autorelease];

自动释放是这里的关键。

感谢你的回复...

EN

回答 5

Stack Overflow用户

发布于 2012-05-23 17:27:57

感谢大家的建议。

解决方案:

已使用ARCimageWithContentsOffFile初始化图像。

代码语言:javascript
复制
image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:imageName ofType:nil]];

是的,imageNamed只适用于...好吧没什么大不了的..。

票数 4
EN

Stack Overflow用户

发布于 2012-05-23 05:28:06

代码语言:javascript
复制
image = [[UIImage imageNamed:imageName] autorelease];

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-05-22 23:28:09

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10705104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档