iOS中的UIImage内存泄漏

时间:2011-05-24 10:41:23

标签: iphone ipad

我有来自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警告“调用者此时不拥有的对象的引用计数的不正确减少”,

如果删除[图像发布],则会显示“在线分配的对象的潜在泄漏...”。

如何解决问题?

感谢。

3 个答案:

答案 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