gpt4 book ai didi

cocoa - CGContextDrawImage 吃掉我的内存,有内存泄漏吗?

转载 作者:行者123 更新时间:2023-12-03 16:21:40 60 4
gpt4 key购买 nike

我正在使用 Cocoa 和 Xcode4 在 Mac OS X 10.6 上开发 Mac 应用程序,从相机缓冲区获取图像后,我需要获取图像的原始数据。这是代码:

- (void)captureOutput:(QTCaptureOutput *)captureOutput didOutputVideoFrame:(CVImageBufferRef)videoFrame withSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection
{
CVImageBufferRef imageBufferRef;
@synchronized (self) {
imageBufferRef = CVBufferRetain(videoFrame);
}
if (imageBufferRef) {
CIImage *originalImage = [CIImage imageWithCVImageBuffer:imageBufferRef];

// Denoise
[noiseReductionFilter setValue:originalImage forKey:@"inputImage"];
CIImage *denoisedImage = [noiseReductionFilter valueForKey:@"outputImage"];
NSCIImageRep *denoisedImageRep = [NSCIImageRep imageRepWithCIImage:denoisedImage];
//

NSImage *image = [[NSImage alloc] initWithSize:[denoisedImageRep size]];
[image addRepresentation:denoisedImageRep];

NSUInteger width = CVPixelBufferGetWidth(imageBufferRef);
NSUInteger height = CVPixelBufferGetHeight(imageBufferRef);
NSUInteger bytesPerRow = CVPixelBufferGetBytesPerRow(imageBufferRef);
NSUInteger bitsPerSample = [denoisedImageRep bitsPerSample];

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)[image TIFFRepresentation], NULL);
CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, 0, NULL);

[image release];

unsigned char *rawData = malloc(height * width * 4);

NSUInteger bitsPerComponent = 8;

CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Big);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);
CGImageRelease(imageRef);
CGColorSpaceRelease(colorSpace);

free(rawData);

CVBufferRelease(imageBufferRef);
}
}

(我删除了一些代码以使其看起来更清晰,并且我删除的代码保证不会泄漏任何内存。很抱歉这些变量的命名不完美。)

问题所在:

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);

我认为在“CGContextRelease(context);”之后,应该释放内存。但在我运行此应用程序后,内存很快就会耗尽 - Real Mem 中每秒会额外增加约 20MB。

我尝试删除这行 CGContextDrawImage,内存似乎工作正常 - 每秒仅增加数十或数百 KB。

我使用 Instrument 来分析我的应用,但没有发现内存泄漏。

谁能帮我解决这个问题吗?我研究了很多天,但没有找到任何解决方案,甚至没有找到原因。

如果您能给我任何改进此代码或修复其中任何其他问题的建议,我将不胜感激。因为即使我删除该行,它仍然会缓慢地消耗内存,但是如果我阻止整个方法,内存不会耗尽,所以我相信代码中仍然存在一些问题。

我是新手,如果我的帖子格式不正确,而且我的英语很差,请原谅我。

最佳答案

感谢ersentekin的提示,我现在可以结束这个问题了。答案是:

发现问题!它位于“CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)[image TIFFRepresentation], NULL);”行 - 我没有发布“source”!

关于cocoa - CGContextDrawImage 吃掉我的内存,有内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6729351/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com