【问题标题】:Would such assignment of image cause a memory leak?这样的图像分配会导致内存泄漏吗?
【发布时间】:2009-04-01 16:33:22
【问题描述】:
- (void)viewDidLoad {
[super viewDidLoad];
landscape.image = [UIImage imageNamed:@"tenerife1.png"];
}
我将一个新的UIImage 分配给UIImageView 对象的图像属性。我不确定这是否会导致内存泄漏?
【问题讨论】:
标签:
iphone
memory
memory-management
memory-leaks
【解决方案1】:
不,不应该。设置新的时候应该自动释放旧图像,而“imageNamed”方法使用autorelease,所以你应该可以。
【解决方案2】:
嘿,考虑到 imageNamed 存在严重的内存问题,因为您失去了对其缓存的控制 - 即:一旦您完成了图像,您就无法回收该内存。一个快速的谷歌搜索会让你知道有多少人遇到了 imageNamed 的问题
我参加了苹果 iphone 技术讲座,演讲的人也证实了同样的事情 - 他建议使用 imageWithContentsOfFile 而不是 imageNamed
如果您只有几个小图像,则可以使用 imageWithContentsOfFile,即使它有点慢 - 并实现您自己的缓存逻辑 - 请查看这个很棒的链接以了解如何做到这一点here
【解决方案3】:
这取决于image 属性的定义方式。如果它被定义为retain,或者,我想,甚至是copy,应该没问题。如果将其定义为 assign,您最终会尝试引用已释放的内存并导致程序崩溃。
【解决方案4】:
通常不会,但这取决于您如何定义landscape.image。见上面的帖子。小心使用其中的很多:
[UIImage imageNamed:@"tenerife1.png"];
因为这些图像往往会填满内存,而不会被释放。