バックグラウンドでのみ実行されるアプリケーションがあります ( LSBackgroundOnly
info.plist ファイルで指定することにより)。問題は、並列キューで実行するすべてのブロックが解放されないことです。コードはメモリ管理された環境で実行されます - GC は関与しません。
(簡略化された) コードは以下のようになります。Blubber は、テスト用に NSDate を保持するダミー クラスです。また、ログを記録するためretain
に 、release
、 を上書きします。dealloc
NSOperationQueue *concurrentQueue = [[NSOperationQueue alloc] init];
[concurrentQueue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount];
Blubber *aBlubber = [[Blubber alloc] init];
aBlubber.aDate = [NSDate date];
[concurrentQueue addOperationWithBlock:^{
NSAutoreleasePool *blockPool = [[NSAutoreleasePool alloc] init];
NSDate *test = [aBlubber aDate];
NSLog(@"Block DONE");
[blockPool release];
}];
[aBlubber release];
[concurrentQueue release];
アプリケーションを通常の (つまり、バックグラウンドではない) アプリケーションに変更すると、UI を介して入力が行われるたびにブロックが解放されるのを観察できます (フォーカスを別のウィンドウに変更するだけでも十分です)。私の backgorund アプリは HID USB ドライバーを介して直接入力を受け取り、ウィンドウやメニュー バーがないため、これは発生しません。
実行ループを手動で強制する方法や、完成したブロックを解放するようにキューに指示する責任があるものはありますか?
(ブロックによって保持されていた他のすべてのオブジェクトも解放されず、大量のメモリ リークが発生します。これらのリークは、Leaks ツールまたは ObjectAllocations ツールでは検出できませんが、top を使用するとメモリ消費が急増することが観察できます。)