我正在编写这个方法来计算图像的平均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: 我不释放CGImageRef,但是在几个循环(5次以上)后程序会崩溃,并出现“低内存警告错误”。
选项2: 我添加了一行 CGImageRelease(rawImageRef) 然后再方法返回之前。现在,在第二个循环后程序就崩溃了,我得到了传递给该方法的UIImage的EXC_BAD_ACCESS错误。当我在Xcode中尝试分析(而不是运行)时,会在这一行收到以下警告。 “错误地减少了调用者此时未拥有的对象的引用计数”
我应该在哪里以及如何释放CGImageRef?
谢谢!