Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos NSImage TIFF表示法不';不能用电弧释放_Macos_Cocoa_Memory_Memory Leaks_Automatic Ref Counting - Fatal编程技术网

Macos NSImage TIFF表示法不';不能用电弧释放

Macos NSImage TIFF表示法不';不能用电弧释放,macos,cocoa,memory,memory-leaks,automatic-ref-counting,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 bytes

我有一个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] );
}
问题是,应用程序消耗的内存量超出正常范围。当我在探查器中运行它时,它表明使用的90%内存由[NSImage TIFFRepresentation](上面粗体显示)分配

i、 e.函数返回后,TIFFRepresentation数据和NSBitmapImageRep即使不在作用域内,也不会被释放

为什么??我应该/可以做什么来强制ARC释放这些块

对于使用非ARC的“旧方法”,我只需在图像的while循环中放置一个自动释放池,这将解决问题。ARC有这样的概念吗

谢谢


(PS.NSZombies未启用。)

自动释放池在概念上仍然可以使用ARC,您只是不能再使用
NSAutoreleasePool

改用新的
@autoreleasepool
关键字:

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

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

改用新的
@autoreleasepool
关键字:

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

可能需要指出的是,所有这些都发生在后台线程中。当线程退出时,所有内存都被正确释放,就像自动释放池一样。指出所有这些都发生在后台线程中可能是相关的。当线程退出时,所有内存都被正确释放,就像自动释放池一样。确实如此!!!刚刚发现,为了清楚起见,OSX框架似乎没有使用ARC(至少没有完全使用),因此API调用仍然需要一个自动释放池,并用@autoreleasepool包装循环内部解决了这个问题。@KevinFranklin:框架是否使用ARC无关紧要(按设计);创建线程时,您负责将自动释放池放置到位,以捕获在该线程上自动释放的任何对象。(如果您的控制台中没有收到关于此的日志消息,我会感到惊讶。)我确实有许多线程,并且没有在它们周围使用自动释放池,也没有收到任何关于此的警告或任何内存泄漏。我只是认为这是为我现在处理的?@KevinFranklin:你(或你)是如何创建线程的?真的!!!刚刚发现,为了清楚起见,OSX框架似乎没有使用ARC(至少没有完全使用),因此API调用仍然需要一个自动释放池,并用@autoreleasepool包装循环内部解决了这个问题。@KevinFranklin:框架是否使用ARC无关紧要(按设计);创建线程时,您负责将自动释放池放置到位,以捕获在该线程上自动释放的任何对象。(如果您的控制台中没有收到关于此的日志消息,我会感到惊讶。)我确实有许多线程,并且没有在它们周围使用自动释放池,也没有收到任何关于此的警告或任何内存泄漏。我只是认为这是为我现在处理的?@KevinFranklin:你(或你)是如何创建线程的?