ios - 为什么我只分配了7 MB的内存,却收到内存警告?

标签 ios memory-management memory-warning

我正在iPod touch设备上运行我的iOS应用,并且上出现内存警告,即使总分配峰值仅为7 MB ,如下所示(按下游戏场景时会发生这种情况):

我发现奇怪的是什么:

  • 左峰(在时间0.00)对应于分配的20 MB内存(简介场景),尽管如此,它不发出任何内存警告。
  • 中心峰值(在时间35.00)对应于 mock 分配的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中运行。因此,其他应用程序可能会占用大量内存,并且您的应用程序也会收到内存警告。您将收到内存警告,直到内存不足为止。

    要了解应用程序中的内存实际发生了什么,您应该

  • 通过泄漏对您的应用程序进行配置(ARC不保证您没有泄漏,即自我捕获问题)。
  • 使用堆快照分析(此处简称为http://bentrengrove.com/blog/2013/4/26/heapshot-analysis)

  • 并查看有关iOS中内存和虚拟内存的帖子:http://liam.flookes.com/wp/2012/05/03/finding-ios-memory/

    关于ios - 为什么我只分配了7 MB的内存,却收到内存警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18590063/

    相关文章:

    ios - 用画外音模拟 UIAlertView : making the correct sound

    ios - 如何增加 UILabel 中文本及其下划线之间的空间?

    ios - JSON 到 UITableView 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序

    ios - 内存压力和内存泄漏一样吗?

    ios - UIImagePickerControllerOriginalImage 收到内存警告并崩溃

    ios - 如何从MasterView的TableViewCell(Xib Cell)导航到DetailView的TableView

    c++ - NUMA 架构上大 (8MB) 内存区域的可扩展分配

    c++ - 递归查找数组中的最小值和最大值

    ios - 所有 iPad 版本的内存警告阈值