【问题标题】:mem allocation with imageNamed使用 imageNamed 分配内存
【发布时间】:2011-11-02 21:51:18
【问题描述】:
我想显示一些图像,当图像不可用时,我想显示默认图像。
使用分析功能时,我收到有关潜在泄漏的警告。
我明白当使用 imageNamed 时没有分配内存,有什么好的解决方法?
请参阅下面我的代码的一部分
if (!isMyFileThere){
image = [UIImage imageNamed:@"default.png"];
}
else{
image = [[UIImage alloc] initWithContentsOfFile:pngFilePath];
}
【问题讨论】:
标签:
iphone
imagenamed
initwithcontentsoffile
【解决方案1】:
如果您希望对象在您手动释放之前一直保留,您应该使用保留,自动释放将对象添加到当前的 NSAutorelease 池中,该池在每次运行循环迭代结束时被耗尽。如果您尝试使用已释放的对象,您的程序将会崩溃。
在 iOS 5.0 中,如果您启用 ARC,您将不再需要使用“retain”、“autorelease”或“release”。这些是由编译器自动添加的。
【解决方案2】:
image = [[UIImage alloc] initWithContentsOfFile:pngFilePath]; 你已经完成了一个分配,你现在必须释放它,如果你不这样做,这可能会导致泄漏。另一个语句是自动释放的对象。
【解决方案3】:
这是自动发布的
image = [UIImage imageNamed:@"default.png"];
这不是
image = [[UIImage alloc] initWithContentsOfFile:pngFilePath];
你需要这样做:
image = [[[UIImage alloc] initWithContentsOfFile:pngFilePath] autorelease];
规则是,如果您的方法名称以alloc、new、copy 或muteableCopy 开头,则您拥有它并需要自己释放它,可以使用release 或autorelease。其他任何东西都不是你的,所以你不能释放它。
如果你在一个对象上调用retain,你必须release(或autorelease)同样的次数:)