0

我想显示一些图像,当图像不可用时,我想显示默认图像。使用分析功能时,我收到有关潜在泄漏的警告。我明白当使用 imageNamed 时没有分配内存,有什么好的解决方法?请参阅下面我的代码的一部分

if (!isMyFileThere){
    image = [UIImage imageNamed:@"default.png"];            
}
else{
    image = [[UIImage alloc] initWithContentsOfFile:pngFilePath];
}
4

3 回答 3

3

这是自动发布的

 image = [UIImage imageNamed:@"default.png"];

这不是

image = [[UIImage alloc] initWithContentsOfFile:pngFilePath];

你需要这样做:

image = [[[UIImage alloc] initWithContentsOfFile:pngFilePath] autorelease];

规则是,如果您的方法名称以,开头alloc,或者您拥有它并且需要自己释放它,无论是还是。其他任何东西都不是你的,所以你不能释放它。newcopymuteableCopyreleaseautorelease

如果你调用retain一个对象,你必须release(或autorelease)它相同的次数:)

于 2011-08-24T15:05:00.533 回答
0

image = [[UIImage alloc] initWithContentsOfFile:pngFilePath];你已经完成了一个分配,你现在必须释放它,如果你不这样做,这是一个潜在的泄漏。另一条语句是自动释放的对象。

于 2011-08-24T15:05:43.563 回答
0

如果你想保持对象直到你手动释放它,你应该使用保留,自动释放将对象添加到当前的 NSAutorelease 池中,该池在每次运行循环迭代结束时被耗尽。如果您尝试使用已释放的对象,您的程序将崩溃。

在 iOS 5.0 中,如果您启用 ARC,您将不再需要使用“retain”、“autorelease”或“release”。这些是由编译器自动添加的。

于 2011-08-24T15:12:38.800 回答