Следующий код работает так, как я этого хочу, но каждый раз, когда я его называю, 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 в ноль, и обычно, когда я это делаю, я получаю сбои. Благодаря!
Вы всегда должны выпускать то, что создаете. Таким образом, вы освобождаете 'depthImageRef' правильно. проверьте, ссылаетесь ли вы на 'depthImageRef' после его выпуска. Более того, что это такое ??? ---- '> CFRelease (поставщик); > CGDataProviderRelease (поставщик); 'почему вы дважды выпускаете Provider? – croyneaus4u