NSImage TIFFRepresentation不会随ARC一起发布

时间:2012-05-05 22:39:23

标签: macos cocoa memory memory-leaks automatic-ref-counting

我有一个处理数千张图像的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释放这些块?

以旧的方式&#39;使用非ARC我只是在while循环中为图像放置一个自动释放池,这将解决问题。 ARC有这样一个概念吗?

感谢。

(PS.NSZombies未启用。)

1 个答案:

答案 0 :(得分:4)

自动释放池在概念上仍然可用于ARC,您不能再使用NSAutoreleasePool类了。

改为使用新的@autoreleasepool关键字:

@autoreleasepool {
   //Do stuff that you previously would have wrapped in an NSAutoreleasePool...
}