重复图像加载时OS X ARC内存增加

时间:2012-08-21 13:33:57

标签: objective-c macos automatic-ref-counting nsimage nsautoreleasepool

在使用自动引用计数编写的应用程序中重复加载不同的NSImages时,我遇到了一个问题。似乎ARC没有正确释放图像对象,而是随着列表的迭代,内存使用量增加,直到迭代完成,此时内存被释放。

在某些情况下,我发现在整个过程中使用了多达2GB的内存。有一个非常类似的问题a good discussion on SO,最终将进程放在NSAutoReleasePool中并释放映像并耗尽池。如果我不使用ARC,这对我也有用,但是不可能在ARC中调用这些对象/方法。

有没有办法让这项工作在ARC工作?似乎ARC应该自己解决这个问题 - 这让我觉得这些对象没有被释放的事实必然是OS X的错误。(我用XCode 4.2.1运行Lion)。 / p>

导致问题的代码类型如下:

+(BOOL)checkImage:(NSURL *)imageURL
{
    NSImage *img = [[NSImage alloc] initWithContentsOfURL:imageURL];
    if (!img)
         return NO;

    // Do some processing
    return YES;
}

在循环中重复调用此方法(例如,300次)。对应用程序进行概要分析后,内存使用量将继续增加,每个映像分配7.5MB。如果未使用ARC,则可以执行以下操作(如this topic中所述):

+(BOOL)checkImage:(NSURL *)imageURL
{
    NSAutoReleasePool *apool = [[NSAutoReleasePool alloc] init];
    NSImage *img = [[NSImage alloc] initWithContentsOfURL:imageURL];
    if (!img)
         return NO;

    // Do some processing

    [img release];
    [apool drain];

    return YES;
}

有谁知道如何强制ARC进行内存清理?目前,我已将该函数放入一个文件中,该文件使用-fno-objc-arc作为编译器标志传入。这样做没问题,但让ARC为我做这件事会很好。

1 个答案:

答案 0 :(得分:3)

使用@autoreleasepool,如下:

+(BOOL)checkImage:(NSURL *)imageURL
{
    @autoreleasepool { // << push a new pool on the autotrelease pool stack
      NSImage *img = [[NSImage alloc] initWithContentsOfURL:imageURL];
      if (!img) {
         return NO;
      }
      // Do some processing
    } // << pushed pool popped at scope exit
    return YES;
}