以下代码将占用 ~410MB 内存,不会再次释放。(使用dispatch_sync
代替的版本dispatch_async
将需要约 8MB 内存)
我预计会出现高内存使用高峰,但它应该会再次下降......泄漏在哪里?
int main(int argc, const char * argv[]) {
@autoreleasepool {
for (int i = 0; i < 100000; i++) {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{
NSLog(@"test");
});
}
NSLog(@"Waiting.");
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:60]];
}
return 0;
}
我试过了:
- 在循环周围和内部添加@autoreleasepool
- 添加
NSRunLoop run
到循环
我尝试了几种组合,但从未发现内存减少(即使等待几分钟后)。我知道包含以下语句的 GCD 参考指南:
尽管 GCD 调度队列有自己的自动释放池,但它们不能保证这些池何时耗尽。
此代码中是否存在内存泄漏?如果没有,有没有办法强制队列释放/排出完成的块?