我的应用程序在内存为 0.5GB 的设备上崩溃。然而,在 Xcode 中分析内存使用情况 - 它很少超过 140MB。我用仪器检查过泄漏情况,但没有发现明显的泄漏。
但是,当我运行我的应用程序时,“其他进程”使用的内存总是非常高。这是启动后的静止状态:
我在代码中的每个循环周期中添加了 1 秒延迟,并发现在每个循环中,“其他进程”使每个对象的内存使用量增加了约 3MB,直到在 0.5GB 设备上耗尽并崩溃。
这个问题 https://stackoverflow.com/questions/27383758/xcode-memory-usage-comparison表明这些是使用该内存的其他应用程序,但我已经关闭了所有其他应用程序,并且使用情况与我的循环代码直接相关。
什么可能在我的应用程序中实际运行的其他进程中使用内存?为什么我的“其他进程”占用了这么多内存?
为了让大家了解我在做什么,我从 Parse 中提取数据,然后循环访问每个返回的对象并从数据创建一个 SKNode 子类对象。我将此节点添加到数组(仅供参考)和场景中。这是我在主线程上执行的添加了延迟的代码。注意该行:
self drawRelationships:[_batches objectAtIndex:_index] forMini:_playerMini];
是一个 BFTask 等等异步的。我将数组分成更小的批次,这样我就可以在绘制每个批次时看到增量的内存使用情况。如果我尝试一次绘制全部,OOM 会立即发生......
- (void)drawNewRelationships
{
_batches = [NSMutableArray array];
_index = 0;
[_playerMini fetchInBackgroundWithBlock:^(PFObject *object, NSError *error) {
[ParseQuery getNewRelationshipsForMini:_playerMini current:_miniRows.relationshipIds withBlock:^(NSMutableArray *newRelationships) {
_batches = [self batchArrays:3 fromArray:newRelationships];
_index = 0;
[self drawBatches];
}];
}];
}
- (void)drawBatches
{
if ([_batches objectAtIndex:_index]) {
[self drawRelationships:[_batches objectAtIndex:_index] forMini:_playerMini];
_index++;
if (_index < [_batches count]) {
[self performSelector:@selector(drawBatches) withObject:nil afterDelay:1];
}
}
}
该节点包含其他数据(几个数组、自定义对象),我尝试在删除所有数据的情况下运行该应用程序。我尝试过在主线程和后台线程上运行。我尝试过使用 BFTask 异步执行操作。我尝试过的所有操作最终都会产生相同的行为 - 创建这些 SKNode 对象会耗尽“其他进程”中的内存,直到在内存不足的设备上崩溃。
值得注意的是,这种行为是从 iOS9 才开始出现的。
基本上,什么可以在“其他进程”中使用所有这些内存以及如何释放它?
Update
我尝试运行 Sprite Kit 示例应用程序,甚至在启动时在其他进程中使用 ~550MB。这可能是 Sprite Kit 的一个主要错误吗?