gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 08:01:41 24 4
gpt4 key购买 nike

我正在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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com