Я пишу этот метод для вычисления средних значений R, G, B изображения. Следующий метод принимает UIImage как вход и возвращает массив, содержащий значения R, G, B входного изображения. У меня есть один вопрос: Как/Где я должен правильно выпускать CGImageRef?
-(NSArray *)getAverageRGBValuesFromImage:(UIImage *)image
{
CGImageRef rawImageRef = [image CGImage];
//This function returns the raw pixel values
const UInt8 *rawPixelData = CFDataGetBytePtr(CGDataProviderCopyData(CGImageGetDataProvider(rawImageRef)));
NSUInteger imageHeight = CGImageGetHeight(rawImageRef);
NSUInteger imageWidth = CGImageGetWidth(rawImageRef);
//Here I sort the R,G,B, values and get the average over the whole image
int i = 0;
unsigned int red = 0;
unsigned int green = 0;
unsigned int blue = 0;
for (int column = 0; column< imageWidth; column++)
{
int r_temp = 0;
int g_temp = 0;
int b_temp = 0;
for (int row = 0; row < imageHeight; row++) {
i = (row * imageWidth + column)*4;
r_temp += (unsigned int)rawPixelData[i];
g_temp += (unsigned int)rawPixelData[i+1];
b_temp += (unsigned int)rawPixelData[i+2];
}
red += r_temp;
green += g_temp;
blue += b_temp;
}
NSNumber *averageRed = [NSNumber numberWithFloat:(1.0*red)/(imageHeight*imageWidth)];
NSNumber *averageGreen = [NSNumber numberWithFloat:(1.0*green)/(imageHeight*imageWidth)];
NSNumber *averageBlue = [NSNumber numberWithFloat:(1.0*blue)/(imageHeight*imageWidth)];
//Then I store the result in an array
NSArray *result = [NSArray arrayWithObjects:averageRed,averageGreen,averageBlue, nil];
return result;
}
Я пробовал две вещи: Опция 1: Я оставляю это как есть, но затем, после нескольких циклов (5+), программа вылетает, и я получаю "ошибку предупреждения о низкой памяти"
Вариант 2: Я добавляю одну строку CGImageRelease (rawImageRef) перед возвратом метода. Теперь он падает после второго цикла, я получаю ошибку EXC_BAD_ACCESS для UIImage, которую я передаю методу. Когда я пытаюсь проанализировать (вместо RUN) в Xcode, я получаю следующее предупреждение в этой строке "Неправильный декремент ссылочного счета объекта, который не принадлежит на данный момент вызывающим"
Где и как мне выпустить CGImageRef?
Спасибо!