在使用自动引用计数编写的应用程序中重复加载不同的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为我做这件事会很好。
答案 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;
}