草庐IT

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

coder 2023-07-25 原文

我正在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 - 为什么我只分配了7 MB的内存,却收到内存警告?的更多相关文章

    1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

      作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

    3. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

      我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

    4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    6. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

      为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

    7. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

      通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

    8. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

      它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

    9. ruby - Infinity 和 NaN 的类型是什么? - 2

      我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

    10. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

      如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

    随机推荐