我有一个处理数千张图像的 OSX Cocoa ARC 项目。为了减少图像的数量,我们扫描图像以查看它们是否是统一的颜色,如果是,我们丢弃图像并跟踪其颜色。
获得纯色的代码是:
- (NSColor *)getSolidColor:(NSImage *)image
{
NSBitmapImageRep* raw_img = [NSBitmapImageRep imageRepWithData:[image TIFFRepresentation]];
int Bpr = [raw_img bytesPerRow],spp = [raw_img samplesPerPixel];
unsigned char *data = [raw_img bitmapData];
int w = [raw_img pixelsWide],h = [raw_img pixelsHigh];
uint32_t mask = 0x00FFFFFF;
uint32_t color = *((uint32_t *)data) & mask;
for( int y=0; y<h; y++ )
{
unsigned char *p = data + Bpr*y;
for( int x=0; x<w; x++ )
{
if( color != (*((uint32_t *)p) & mask) )
return( nil );
p += spp;
}
}
return( [raw_img colorAtX:0 y:0] );
}
(为简洁起见,删除了一些错误检查 - 上面的代码假设每个像素有 3 个样本。)
调用它的代码基本上是:
NSString *imageFile;
while( imageFile = [self getNextImageFile] )
{
NSImage *image = [[NSImage alloc] initWithContentsOfFile:imageFile];
if( [image isValid] && [self getSolidColor:image] )
[fileManager removeItemAtPath:imageFile error:nil];
}
问题是应用程序消耗了大量的内存。当我在分析器中运行它时,它表明所用内存的 90% 是由 [NSImage TIFFRepresentation] 分配的(上面加粗。)
即 TIFFRepresentation 数据和 NSBitmapImageRep 永远不会被释放,即使它们在函数返回后立即超出范围。
为什么?我应该/可以做些什么来强制 ARC 释放这些块?
使用非ARC的“旧方式”,我只需在图像的while循环中放置一个自动释放池,这样就可以解决问题。ARC有这样的概念吗?
谢谢。
(PS. NSZombies 未启用。)