2014-09-17 2 views
0

다음 코드는 내가 원하는 방식으로 작동하지만, 내가 호출 할 때마다 Instruments는 하나의 CGImage 메모리 누수가 있다고 알려줍니다. 나는 언제 무엇을 공개해야하는지 이해하는 데 어려움을 겪고있다. 다음은 내 파일의 @interface 섹션에서 가져온 것입니다.CGImage 메모리 누수

CGImageRef depthImageRef; 
char *depthPixels; 
NSData *depthData; 

다음 코드에서는 기본적으로 depthPixels을 변경 한 다음 결과를 새로운 depthImageRef에 저장합니다.

size_t width     = CGImageGetWidth(depthImageRef); 
size_t height     = CGImageGetHeight(depthImageRef); 
size_t bitsPerComponent   = CGImageGetBitsPerComponent(depthImageRef); 
size_t bitsPerPixel    = CGImageGetBitsPerPixel(depthImageRef); 
size_t bytesPerRow    = CGImageGetBytesPerRow(depthImageRef); 


for (int row = 0; row < height; row += 1) { 

    for (int bitPlace = 0; bitPlace < bytesPerRow; bitPlace += 4) { 

     CGPoint pointForHeight = CGPointMake((bitPlace/4) - place.x, row - place.y); 

     int distanceFromLocation = sqrt(pow(place.x - pointForHeight.x, 2) + pow(place.y - pointForHeight.y, 2)); 
     int newHeight = blopHeight - (5 - sizeSlider.value)*distanceFromLocation; 

     NSInteger baseBitPlace = row*bytesPerRow + bitPlace; 

     CGFloat currentHeight = depthPixels[baseBitPlace]; 
     if (newHeight > currentHeight) { 
      depthPixels[baseBitPlace] = newHeight; 
     } 
    } 
} 

CGColorSpaceRef colorspace  = CGColorSpaceCreateDeviceRGB(); 
CGBitmapInfo bitmapInfo   = CGImageGetBitmapInfo(depthImageRef); 
CGDataProviderRef provider  = CGDataProviderCreateWithData(NULL, depthPixels, [depthData length], NULL); 

depthImageRef = CGImageCreate (
           width, 
           height, 
           bitsPerComponent, 
           bitsPerPixel, 
           bytesPerRow, 
           colorspace, 
           bitmapInfo, 
           provider, 
           NULL, 
           false, 
           kCGRenderingIntentDefault 
           ); 
CGColorSpaceRelease(colorspace); 
CFRelease(provider); 
CGDataProviderRelease(provider); 

은 내가 depthImageRef을 만드는 유지하지만, 그것을 해제하지 않기 때문에 누수가 생성 생각합니다. CGImageRelease (depthImageRef)를 여러 위치에 배치하고 depthImageRef를 nil로 설정해 보았습니다. 일반적으로 이렇게하면 충돌이 발생합니다. 감사!

+0

항상 자신이 만든 것을 릴리스해야합니다. 따라서'depthImageRef'를 해제하는 것이 맞습니다. 그것을 release 한 후에'depthImageRef'를 참조하고 있는지 확인하십시오. 또한, 이것은 무엇입니까? ----'> CFRelease (provider); > CGDataProviderRelease (공급자), '왜 두 번 공급자를 출시합니까? – croyneaus4u

답변

0

위 코드를 호출하여 depthImageRef를 여러 번 재생하면 CGImageRefs를 반복적으로 만들고 해제하지 않고 메모리가 누출됩니다. dataImageRef을 재생성하는 경우 새 이미지를 생성하기 직전에 이전 이미지를 해제해야합니다.

// works, even if depthImageRef is NULL such as in the initial case. 
CGImageRelease(depthImageRef); 
depthImageRef = CGImageCreate (//... 

또한 당신이 당신의 dealloc 방법에 CGImageRelease를 호출하고 할당 해제에 depthPixels 버퍼를 확보하고 있는지 확인하십시오. CGDataProviderRelease은 콜백을 전달하여 이미 해당 버퍼를 해제하지 않으면 전달하는 버퍼를 해제하지 않습니다. CGDataProviderRelease(provider)으로 전화하기 때문에 CFRelease(provider)에 대한 전화가 필요하지 않습니다.

1

아마도 depthImageRef를 UIImage 어딘가에 돌려 보내야합니다. Like

UIImage *depthImage = [UIImage imageWithCGImage:depthImageRef]; 

일단 깊이 이미지가 있으면 depthImageRef를 릴리스 할 수 있습니다. 충돌이 있어서는 안됩니다.