2014-09-17 5 views
0

Следующий код работает так, как я этого хочу, но каждый раз, когда я его называю, Instruments сообщает мне, что у меня одна утечка памяти CGImage. У меня возникли проблемы с пониманием того, что выпустить и когда. Ниже приведен раздел @interface моего файла.Ошибка памяти CGImage

CGImageRef depthImageRef; 
char *depthPixels; 
NSData *depthData; 

В следующем коде я в основном изменяю глубинные пиксели, а затем сохраняю результат в новой области 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 в ноль, и обычно, когда я это делаю, я получаю сбои. Благодаря!

+0

Вы всегда должны выпускать то, что создаете. Таким образом, вы освобождаете 'depthImageRef' правильно. проверьте, ссылаетесь ли вы на 'depthImageRef' после его выпуска. Более того, что это такое ??? ---- '> CFRelease (поставщик); > CGDataProviderRelease (поставщик); 'почему вы дважды выпускаете Provider? – croyneaus4u

ответ

0

Если вы повторно создаете depthImageRef несколько раз, вызывая вышеуказанный код, вы пропускаете память, повторно создавая CGImageRefs и не освобождая их. Если вы воссоздаете dataImageRef, вы должны выпустить старое изображение непосредственно перед созданием нового.

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

быть также уверены, что вы вызываете CGImageRelease в методе dealloc и освобождая свой depthPixels буфер в dealloc. CGDataProviderRelease не освободит буфер, который вы передадите, если вы не передадите обратный вызов, чтобы уже освободить этот буфер. Вам не нужен звонок для CFRelease(provider), так как вы звоните CGDataProviderRelease(provider).

1

Возможно, вы должны перевернуть depthImageRef обратно в UIImage где-нибудь. Как

UIImage *depthImage = [UIImage imageWithCGImage:depthImageRef]; 

Как только у вас есть значение depthImage, вы можете освободить depthImageRef. Он не должен вызывать сбоев.

 Смежные вопросы

  • Нет связанных вопросов^_^