如何重用UIImage

时间:2011-07-13 16:06:20

标签: iphone objective-c ios

我正在使用我从教程中获得的一些示例代码,使用AVCamRecorder创建基本上的快照。它不会保存图片,只要我点击一个按钮,它就会在实时摄像机视图下的一个小矩形中显示它。每次单击按钮更新图像时,它似乎分配了越来越多的内存,所以我放了一个if (image) {[image release]},然后继续使用其余的代码来捕获图像。我遇到的问题是,如果我反复快速点击按钮,最终我会点击EXC_BAD_ACCESS。我尝试在将if (image)分配给我的视图之前立即插入[NSThread sleepForTimeInterval:1],但我仍然获得了EXC_BAD_ACCESS。我尝试在最后添加if (image) { [image release]; exifAttachments = nil; } [[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:stillImageConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { exifAttachments = CMGetAttachment(imageDataSamplebuffer, kCGImagePropertyExifDictionary, NULL); if (exifAttachments) { // NSLog } else { // NSLog } NSData *imagedata = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; image = [[UIImage alloc] initWithData:imageData]; if (image) { self.capturedPicView.image = image; } }];` ,但这也没有帮助。多次单击按钮后,我仍然可以获得EXC_BAD_ACCESS。有没有正确的方法来重用此视图?感谢

{{1}}

1 个答案:

答案 0 :(得分:3)

图像变量是否声明为__block?如果没有,你可能会得到各种奇怪的东西,因为你无法在一个区块内修改它。

您可能不需要单独的图像变量 - 只需执行:

self.capturedPicView.image = [[[UIImage alloc] initWithData:imageData] autorelease];

在您的区块中。

P.S。看起来你的原始内存泄漏是由于没有发布新图像 - 你可以为UIImage创建添加自动释放,或者只是在分配后立即释放它(UIImageView.image保留它):

image = [[UIImage alloc] initWithData:imageData];
if (image) {
    self.capturedPicView.image = image;
    [image release];
}