2011-05-24 72 views
0

我有UIImage对象潜在的内存泄漏问题。代码如下。请帮忙。从iOS的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
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

+0

尝试了您的建议。警告仍然显示 - 在线分配的物体的潜在泄漏... – user403015 2011-05-24 11:00:27

+0

哪个物体负责泄漏。我猜这个泄漏是在其他地方...... – visakh7 2011-05-24 11:01:42

+0

如何调查?我尝试过使用乐器,但我真的不知道用它来检查泄漏。 – user403015 2011-05-24 11:03:14

3

的问题是,[UIImage new]相同[[UIImage alloc] init],所以你已经有一个保留的实例。然后通过调用[UIImage imageWithCGImage:]来抛出指向实例的指针,该指针返回一个不需要保留的自动释放实例!

该解决方案将[UIImage new]从您的代码以及末尾的[image release]中排除。

+0

我试过“UIImage * image = nil;”,但给出了相同的警告。 – user403015 2011-05-24 10:45:21

+0

是的,你也需要抛出[image release],因为图像已经被自动释放。 – JustSid 2011-05-24 10:46:24

+0

谢谢,但是在我删除[image release]之后,它显示“线上分配的对象的潜在泄漏...”。请帮忙。 – user403015 2011-05-24 10:51:06

0

你分配使用new方法UIImage对象的新实例,并将其分配给image变量。然后,您立即通过使用imageWithCGImage:方法为变量分配不同实例来泄漏该实例。

开始时不需要做UIImage *image = [UIImage new];。你可以简单地声明你的变量,而不用指定任何实例。最佳做法是最初将nil分配给它。

当你这样做时,你不需要稍后释放图像对象,因为imageWithCGImage返回一个自动释放对象。

+0

尝试了您的建议。警告仍然显示 - 在线分配的对象的潜在泄漏...任何想法解决? – user403015 2011-05-24 11:01:55