我有一个仅在后台运行的应用程序(通过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 可以观察到内存消耗猛增。)