2016-06-23 10 views
0

이미지를 CVPixelBufferRef로 변환하려고하는데 사용 중이지만 몇 초 후에 앱이 다운됩니다. 응용 프로그램이 시작될 때 2MB와 같은 메모리를 사용하지만 15 ~ 20 초 후에는 300MB까지 올라갈 수 있습니다. 내 함수는이iOS에서 메모리 누수가 발생하여 이미지를 CVPixelBufferRef로 변환합니다.

- (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; 
} 

내가 그냥 긴 작업의 경우 @autoreleasepool {당신의 방법 코드} 나를 위해 그것의 매우 도움과 노력이 기능

+1

/이 함수가 반환하는 버퍼를 해제하는 코드는 무엇입니까? – Feldur

+0

나는 이것을 부른다. CGImageRef imageRef = [myImage CGImage]; CVImageBufferRef pixelBuffer = [self pixelBufferFromCGImage : imageRef]; –

+0

내가 풀어려고했던 버퍼를 공개하지는 않지만 충돌이 발생했습니다. CFRelease (pixelBuffer)를 시도한 곳을 어디에서 사용해야할지 모릅니다. @Feldur –

답변

0

에 ImageRef을주는거야하고

루프
+0

을 해제 한 후에 버퍼를 사용하고 있지만 실제로 적용되지는 않습니다. –

+0

이 함수를 1000 번 호출합니다. –

+0

루프에서 호출하는 방법은 무엇입니까? 그렇다면 재귀 형식으로 시도하십시오. 그리고 똑같은 autorelasepool에 코드를 넣으십시오. 같은 방법으로 호출 했으므로 그 코드를 사용하면 잘 작동합니다. @autoreleasepool { CGImageRef rawImageRef = [image CGImage]; [self NpixelBufferFromCGImage : rawImageRef]; } –