释放对象后的内存问题

时间:2011-10-19 11:43:47

标签: ios cocoa-touch memory-management

NSArray *imageExtension  = [info.ThemeImage componentsSeparatedByString:@"."];
NSString *path = [[NSBundle mainBundle] pathForResource:[imageExtension objectAtIndex:0]ofType:@"png"];
UIImage *image = [[UIImage alloc]initWithContentsOfFile:path];
image=[image addImageReflection:0.50];

[CarouselView  setFrame:CGRectMake(0,-200, image.size.width, image.size.height)];

UIButton *button = [[UIButton alloc]init];
[button setFrame:CGRectMake(0,0, image.size.width, image.size.height)];

[button setBackgroundImage:image forState:UIControlStateNormal];
[image release]; 

在释放对象图像后,我确实有内存泄漏......

我不知道为什么它会在仪器泄漏中显示内存泄漏

4 个答案:

答案 0 :(得分:3)

上面的代码有三个问题会导致内存泄漏。

首先,您在此处创建image

UIImage *image = [[UIImage alloc]initWithContentsOfFile:path];

然后将指针image分配给其他内容,从而丢失原始引用:

image=[image addImageReflection:0.50];

addImageReflection我假设给你一个自动释放的对象。

尽管如此,您稍后会发布image

[image release]; 

此处发布的内容不是您分配的原始指针,而是后来分配的自动释放对象。所以你通过过度释放来创造第二个问题。

最后,你有第三个问题。您在此处创建的对象button永远不会发布:

UIButton *button = [[UIButton alloc]init];

答案 1 :(得分:1)

你没有释放按钮吗?如果上面的代码在函数中并且它被调用很多时间按钮将泄漏。 尝试添加

[button release];

答案 2 :(得分:0)

你做完之后一样吗?

[[self view] addSubview:button];
[button release];

答案 3 :(得分:0)

这里你要分配一个新的UIImage

UIImage *image = [[UIImage alloc]initWithContentsOfFile:path];

这里你正在对图像做一些动作(反射?),可能这个函数会返回一个自动释放的实例。你将这个实例重新分配给你的原始实例变量。你将失去对原始图像实例的引用,它将会泄露。你也参考了一个自动释放的实例

image=[image addImageReflection:0.50];

你错误地试图在之后释放,这将导致崩溃..

[image release];