【问题标题】:Memory Leak in iOS converting an image to CVPixelBufferRefiOS 中的内存泄漏将图像转换为 CVPixelBufferRef
【发布时间】:2016-10-25 08:40:27
【问题描述】:

我正在尝试将图像转换为 CVPixelBufferRef 以便可以进一步使用,但几秒钟后我的应用程序崩溃了。我可以看到应用程序启动时使用的内存为 2mb,但仅在 15 到 20 秒后,它就达到了 300mb。我的功能是这样的

- (CVPixelBufferRef) NpixelBufferFromCGImage: (CGImageRef) image
{
    int height = 300;
    int width = 400;

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                            [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
                            [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
                            nil];
    CVPixelBufferRef pxbuffer = NULL;

    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, width,
                                      height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options,
                                      &pxbuffer);

    NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);

    CVPixelBufferLockBaseAddress(pxbuffer, 0);
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
    NSParameterAssert(pxdata != NULL);

    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();

    CGContextRef context = CGBitmapContextCreate(pxdata, width,
                                             height, 8, 4*width, rgbColorSpace,
                                             kCGImageAlphaNoneSkipFirst);
    NSParameterAssert(context);
    CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));
    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
                                       CGImageGetHeight(image)), image);
    CGColorSpaceRelease(rgbColorSpace);
    CGContextRelease(context);

    CVPixelBufferUnlockBaseAddress(pxbuffer, 0);

    return pxbuffer;
}

我给这个函数一个 ImageRef

【问题讨论】:

  • 释放此函数返回的缓冲区的代码在哪里/是什么?
  • 我正在调用这个 CGImageRef imageRef=[myImage CGImage]; CVImageBufferRef pixelBuffer = [self pixelBufferFromCGImage:imageRef];
  • 我没有释放我试图释放的缓冲区,但它造成了崩溃。不知道在哪里使用我试过 CFRelease(pixelBuffer); @Feldur
  • 如果您没有释放缓冲区,那么这就是您的内存泄漏的根源。当你释放它时,你需要找出它崩溃的原因。最有可能的是,您在释放后使用缓冲区

标签: ios objective-c memory-leaks cvpixelbuffer


【解决方案1】:

试试看 @autoreleasepool { 你的方法代码} 在长时间操作和循环的情况下,它对我很有帮助

【讨论】:

  • 试过但没有效果。
  • 我正在调用这个函数 1000 次
  • 你是如何循环调用它的?如果是,请尝试使用递归格式。并将代码放在同一个 autorelasepool 中,在哪里调用我尝试过的相同方法,它工作正常,就像 @autoreleasepool { CGImageRef rawImageRef = [image CGImage]; [自我 NpixelBufferFromCGImage:rawImageRef]; }
猜你喜欢
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多