我有很多内存泄漏...... 例如,我有一个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];
但问题不在于,如果我尝试再次运行该代码,应用程序会冻结(我猜你不能发布一些东西,然后再次使用它?(有点新的内存分配和发布的东西..
我该怎么办?如果图像被释放,我是否会在尝试翻转之前重新定义图像?谢谢!
答案 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;