我正在使用我从教程中获得的一些示例代码,使用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}}
答案 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];
}