У меня есть приложение, которое работает только в фоновом режиме (указав 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];
Если я изменю приложение на обычное (то есть не фоновое), я могу наблюдать освобождение блоков всякий раз, когда через пользовательский интерфейс делается какой-либо ввод (даже достаточно изменить фокус на другое окно).
Поскольку мое приложение backgorund получает входные данные непосредственно через драйвер HID USB и не имеет окна или строки меню, этого не происходит.
Есть ли способ вручную принудительно запустить цикл запуска или что-то еще, отвечающее за сообщение очередям об освобождении готовых блоков?
(Все другие объекты, которые были сохранены блоками, также не освобождаются, создавая огромные утечки памяти. Эти утечки не могут быть обнаружены инструментами Утечки или ObjectAllocations, но потребление памяти можно наблюдать стремительно, используя top.)