我正在iPod touch设备上运行我的iOS应用,并且上出现内存警告,即使总分配峰值仅为7 MB ,如下所示(按下游戏场景时会发生这种情况):
我发现奇怪的是什么:
我不明白如果总内存只有7 MB,为什么会收到这些警告。这正常吗?如何避免这种情况?
查看分配密度,我们可以看到以下模式,对我而言,该模式在插入Intro场景的时间(0.00)与插入Game Scene的时间(35.00)之间没有太大差异。 由于密度峰值相似,我认为内存警告是由于其他我无法发现的原因引起的。
编辑:
我一直在建议使用“ Activity 监视器”代替,但是不幸的是,当我使用加载只有30 MB内存分配的加载游戏场景时,我的应用程序崩溃了。这是“ Activity ”监视器报告。
查看该报告,我可以看到总的实际内存使用量总和约为105 MB。鉴于此应引用RAM内存,并且我的模型应具有RAM的256 MB,这不会导致APP崩溃或内存泄漏问题。
我运行了泄漏监视器,它在我的应用程序上没有显示任何泄漏。我还杀死了所有其他应用程序。
但是,在分析报告时,我看到与我的应用程序关联的惊人的 167 MB虚拟内存值。这正常吗?这个值是什么意思?这可能是飞机坠毁的原因吗?如何检测我的代码的哪些区域对此负责?
我的iPod是第4代机型,具有6.4 GB的容量(内存)和仅290 MB的可用内存。我不确定这是否会影响虚拟内存paging的性能。
编辑2:我也更多地看了SpringBoard,其虚拟内存使用量为180 MB。这正常吗?我发现了一些questions/answers,似乎暗示SpringBoard负责自动释放对象(它应该是管理屏幕和家庭botton的过程,但我不确定它是否也与内存管理有关)。这样对吗?
另一个说明。我正在使用ARC。但是我不确定这与问题有很大关系,因为没有明显的内存泄漏,XCode应该转换代码,将release/dealloc/retain调用添加到已编译的二进制文件中。
编辑3:如前所述,我正在使用ARC和Cocos2d(2.0)。我一直在使用“ Activity ”监视器。我发现,如果删除GameCenter身份验证机制,则 Activity 监视器可以正常运行(新疑问:其他任何人也有类似的问题吗?GameCenter身份验证 View 是否保留在某个地方?)。但是我注意到,每次我在GameScene之前的各个场景之间来回导航(初始场景->角色选择->行星选择->角色选择->行星选择->等等。->角色选择..) REAL MEMORY用法增加。一段时间后,我开始收到内存警告,并且该应用程序被iOS杀死。现在的问题是:
->我是否以正确的方式替换了场景?我从各个场景称呼以下内容:
[[CCDirector sharedDirector] replaceScene: [MainMenuScene scene]];
我有 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
}
我想知道场景是否无法正确释放。我验证了正在调用cleanup方法,但是我还在CCLayer dealloc方法上添加了 CCLOG调用,并重建了静态库。结果是dealloc方法似乎没有被称为。
这正常吗? :D
我发现其他人患有similar issues。我想知道它是否与retain cycles and self blocks.有关,我真的需要花一些时间研究这个问题,除非从EDIT 3开始,任何人都可以告诉我我做错了什么:-)
最佳答案
通过所有应用程序和进程共享的所有内存容量均在iOS中运行。因此,其他应用程序可能会占用大量内存,并且您的应用程序也会收到内存警告。您将收到内存警告,直到内存不足为止。
要了解应用程序中的内存实际发生了什么,您应该
并查看有关iOS中内存和虚拟内存的帖子:http://liam.flookes.com/wp/2012/05/03/finding-ios-memory/
关于ios - 为什么我只分配了7 MB的内存,却收到内存警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18590063/