次のコードは最大 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 ディスパッチ キューには独自の自動解放プールがありますが、これらのプールがいつ空になるかは保証されません。
このコードにメモリ リークはありますか? そうでない場合、完成したブロックを解放/排出するようにキューを強制する方法はありますか?