我有来自UIImage对象的潜在内存泄漏问题。代码如下。请帮忙。
UIImage *image = nil; if (x == 0) { image = [UIImage imageWithCGImage:cg1]; } else { image = [UIImage imageWithCGImage:cg2]; } UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; [image release];
我尝试在if-else阻止之后释放UIImage对象,但是Xcode警告“调用者此时不拥有的对象的引用计数的不正确减少”,
如果删除[图像发布],则会显示“在线分配的对象的潜在泄漏...”。
如何解决问题?
感谢。
答案 0 :(得分:3)
问题是[UIImage new]
与[[UIImage alloc] init]
相同,因此您已经拥有了保留的实例。然后通过调用[UIImage imageWithCGImage:]
抛出指向实例的指针,它返回一个你不需要保留的自动释放的实例!
解决方案是从您的代码中抛出[UIImage new]
,最后是[image release]
。
答案 1 :(得分:0)
您正在使用UIImage
方法分配new
对象的新实例,并将其分配给image
变量。然后,您通过使用imageWithCGImage:
方法为变量分配不同的实例来立即泄漏该实例。
您不需要在开头UIImage *image = [UIImage new];
。您可以简单地声明您的变量,而无需为其分配任何实例。好的做法是最初将nil
分配给它。
执行此操作时,您不需要稍后释放图像对象,因为imageWithCGImage
返回自动释放的对象。
答案 2 :(得分:0)
UIImage *image = nil;
if (x == 0) {
image = [UIImage imageWithCGImage:cg1];
} else {
image = [UIImage imageWithCGImage:cg2];
}
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
// Some code
[imageView release];
您拥有对象imageView
而非image
的所有权。所以你应该发布imageView
而不是image
。看看Object ownership in Apple's Memory Management guide