有内存泄漏问题

时间:2012-03-11 20:44:03

标签: ios memory-management uiimageview alloc

我有很多内存泄漏...... 例如,我有一个UIImageView,每次更新时图像都被翻转(动画大约30fps所以这个图像更新并翻转ALOT)

image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored];

它有大量的内存泄漏,所以我在翻了一次之后就发布了它:

image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored];
[image2 release];

但问题不在于,如果我尝试再次运行该代码,应用程序会冻结(我猜你不能发布一些东西,然后再次使用它?(有点新的内存分配和发布的东西..

我该怎么办?如果图像被释放,我是否会在尝试翻转之前重新定义图像?谢谢!

3 个答案:

答案 0 :(得分:2)

可能最简单的方法是将image2设为保留属性,然后分配给self.image2而不是普通image2。这将导致在分配新值时释放旧图像。但是,您需要在autorelease电话中添加[UIImage alloc] init...来电,以释放alloc完成的保留。

答案 1 :(得分:2)

通过重复使用相同的变量名称,您可能会造成不必要的混乱。添加一个临时变量。

UIImage* image; // assuming you set this up earlier, and that it's retained
UIImage* flippedImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationUpMirrored];
// Now we're done with the old image. Release it, so it doesn't leak.
[image release];
// And set the variable "image" to be the new, flipped image:
image = flippedImage;

答案 2 :(得分:1)

您需要将图像视图的image属性设置为生成的图像,然后释放已分配的图像。例如:

image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored];
self.someImageView.image = image2;
[image2 release];

或者,您可以自动释放返回的图像。像这样:

image2 = [[[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored] autorelease];
self.someImageView.image = image2;

编辑:在您澄清了您的要求后,这是一种垂直翻转图像的更好方法。

//lets suppose your image is already set on the image view
imageView.transform = CGAffineTransformIdentity;
imageView.transform = CGAffineTransformMakeScale(1.0, -1.0);

然后当你想把它改回正常时:

imageView.transform = CGAffineTransformIdentity;