我正在 iPod touch 设备上运行我的 iOS 应用程序并且即使总分配峰值只有 7 MB,我也会收到内存警告如下图(推送游戏场景时会出现这种情况):
What 我觉得奇怪就是它:
我不明白为什么如果总内存只有 7 MB,我会收到这些警告。这是正常的吗?我怎样才能避免这种情况?
查看分配密度,我们可以看到以下模式,(对我来说)在推入介绍场景的时刻 (0.00) 和推入游戏场景的时刻 (35.00) 之间没有太大差异。由于密度峰值相似,我认为内存警告是由于我无法发现的其他原因造成的.
EDIT:
我一直在遵循使用“活动监视器”的建议,但不幸的是,我的应用程序在加载游戏场景时崩溃了仅分配 30 MB 内存。这是活动监视器报告。
查看报告,我可以看到实际内存使用总量约为 105 MB。鉴于这应该指的是 RAM 内存,并且考虑到我的模型应该具有256 MB http://appleinsider.com/articles/10/09/08/teardown_of_apples_4th_gen_ipod_touch_finds_256mb_of_ramRAM 这不应导致应用程序崩溃或内存泄漏问题。
我运行泄漏监视器,它在我的应用程序上没有显示任何泄漏。我还杀死了所有其他应用程序。
然而,通过分析该报告,我看到了令人惊讶的情况167 MB 虚拟内存值与我的应用程序关联。这是正常的吗?这个值是什么意思?这可能是崩溃的原因吗?我如何检测代码的哪些区域对此负责?
我的 iPod 是第四代型号,容量(内存)为 6.4 GB,只有 290 MB 可用内存。我不确定这是否会以某种方式影响虚拟内存paging http://en.wikipedia.org/wiki/Paging表现。
编辑2:我还更多地研究了SpringBoard,它的虚拟内存使用量是180 MB。这是正常的吗?我找到了一些问题和答案 https://stackoverflow.com/questions/3558931/springboard-memory-allocation-iphone-ipad这似乎表明 SpringBoard 负责自动释放对象(它应该是管理屏幕和主页按钮的过程,但我不确定它是否也与内存管理有关)。它是否正确?
另一个注意事项。我正在使用ARC。但是我不确定这与问题有多大关系,因为没有明显的内存泄漏,并且 XCode 应该转换代码,添加对编译的二进制文件的释放/释放/保留调用。
编辑3:正如之前所说,我使用ARC和Cocos2d(2.0)。我一直在玩活动监视器。我发现如果我删除 GameCenter 身份验证机制,那么活动监视器运行正常(新的疑问:其他人有类似的问题吗? GameCenter 身份验证视图是否保留在某处?)。然而我注意到,每次我在 GameScene 之前的各个场景之间来回导航时(初始场景 -> 角色选择 -> 行星选择 -> 角色选择 -> 行星选择 -> 等等.. -> 角色选择 ..)真实内存使用情况增加。一段时间后,我开始收到内存警告,并且该应用程序被 iOS 杀死。现在的问题是:
-> 我是否以正确的方式替换场景?我从不同的场景调用以下内容:
[[CCDirector sharedDirector] replaceScene: [MainMenuScene scene]];
I have Cocos2d 2.0 作为静态库而replaceScene的代码是这样的:
-(void) replaceScene: (CCScene*) scene
{
NSAssert( scene != nil, @"Argument must be non-nil");
NSUInteger index = [scenesStack_ count];
sendCleanupToScene_ = YES;
[scenesStack_ replaceObjectAtIndex:index-1 withObject:scene];
nextScene_ = scene; // nextScene_ is a weak ref
}
我想知道场景是否无法正确分配。我验证了清理方法正在被调用,但是我还添加了一个CCLOG调用CCLayer的dealloc方法并重建静态库。结果是dealloc方法好像没有被调用.
这是正常的吗? :D
我发现其他人也有类似问题 http://www.cocos2d-iphone.org/forums/topic/cclayer-vs-ccscene-somewhat-confused/。我想知道这是否与保留循环和自块。 https://stackoverflow.com/questions/7853915/how-do-i-avoid-capturing-self-in-blocks-when-implementing-an-api我真的需要花一些时间研究这个,除非从编辑 3 开始,任何人都可以告诉我我做错了什么:-)