【发布时间】:2023-03-23 03:31:02
【问题描述】:
我想每秒多次调用 image 方法,但我有内存泄漏。
我尝试做CFRelease(rawImageRef);,但返回下一个错误:
-[Not A Type retain]: message sent to deallocated instance 0x14dd3770
更新代码:
- (CGColorRef)averageColorRect:(CGRect)rect {
CGImageRef rawImageRef = CGImageCreateWithImageInRect(_imageRaster, rect);
// This function returns the raw pixel values
CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(rawImageRef));
const UInt8 *rawPixelData = CFDataGetBytePtr(data);
NSUInteger imageHeight = CGImageGetHeight(rawImageRef);
NSUInteger imageWidth = CGImageGetWidth(rawImageRef);
NSUInteger bytesPerRow = CGImageGetBytesPerRow(rawImageRef);
NSUInteger stride = CGImageGetBitsPerPixel(rawImageRef) / 8;
// Here I sort the R,G,B, values and get the average over the whole image
unsigned int red = 0;
unsigned int green = 0;
unsigned int blue = 0;
for (int row = 0; row < imageHeight; row++) {
const UInt8 *rowPtr = rawPixelData + bytesPerRow * row;
for (int column = 0; column < imageWidth; column++) {
red += rowPtr[0];
green += rowPtr[1];
blue += rowPtr[2];
rowPtr += stride;
}
}
CFRelease(data);
CGFloat f = 1.0f / (255.0f * imageWidth * imageHeight);
return [UIColor colorWithRed:f * red green:f * green blue:f * blue alpha:1].CGColor;
}
【问题讨论】:
-
请将您的代码发布为代码,而不是图像。如果您认为它是不可替代的,请保留图像。
-
你应该使用
CGImageRelease,省去你检查NULL的时间。 -
Rich,我在使用 CFRelease 和 CGImageRelease 时遇到同样的错误
-
@mhergon 你怎么称呼这段代码,
_imageRaster是什么?我刚刚使用-[UIImage CGImage]和{0, 0, 100, 100}CGRect运行它,这很好 - 我确实添加了CGImageRelease来修复静态分析器。
标签: ios objective-c memory-leaks crash cgimageref