9 个回答
如果你想让用户 在尽量多的iOS设备上得到比较稳定的体验, 实用过程中不Crash, 不因为GC而停顿, 答案是: 越少约好.
比如, 在一个越狱的iPod touch4上, 如果用户安装了第三方的输入法, 在加上用户频繁切换应用程序, 那么你最好能将内存控制在3M以内. 否则会频繁收到memory warning的提醒.
一旦收到该提醒, iOS会自动调用viewDidLoad方法, 释放none top view, 来节约内存. 有很多代码质量不高的App 就会在这里crash掉.
接着用户在你的App上点击了一些按钮, 刚才这些释放掉的view又需要重新建立. 于是就会卡一下.
如果在memory warning后没有释放足够多的内存, iOS会直接kill掉你的App.
那么, 如何保持内存占用不要太高?
1. tableviewCell中的icon图片要用剪裁过的, 不要把那些1M左右的图片直接从web端传输过来
2. 一些比较深,或者循环比较多的代码block中, 尽量在外围套一层autorelease pool, 执行完毕后直接[pool drain]
3. tableview cell一定要reuse, 其他类似的view也要reuse.
暂时想到的就这些, 哪位有经验的可以帮忙补充下.
比如, 在一个越狱的iPod touch4上, 如果用户安装了第三方的输入法, 在加上用户频繁切换应用程序, 那么你最好能将内存控制在3M以内. 否则会频繁收到memory warning的提醒.
一旦收到该提醒, iOS会自动调用viewDidLoad方法, 释放none top view, 来节约内存. 有很多代码质量不高的App 就会在这里crash掉.
接着用户在你的App上点击了一些按钮, 刚才这些释放掉的view又需要重新建立. 于是就会卡一下.
如果在memory warning后没有释放足够多的内存, iOS会直接kill掉你的App.
那么, 如何保持内存占用不要太高?
1. tableviewCell中的icon图片要用剪裁过的, 不要把那些1M左右的图片直接从web端传输过来
2. 一些比较深,或者循环比较多的代码block中, 尽量在外围套一层autorelease pool, 执行完毕后直接[pool drain]
3. tableview cell一定要reuse, 其他类似的view也要reuse.
暂时想到的就这些, 哪位有经验的可以帮忙补充下.
发布于 2012-12-02
1 条评论
感谢
收藏
•
没有帮助
•
•
作者保留权利
分享
举报
iPad1最大可占到110M左右,如果冲到120M就有可能被杀掉。
iPad2可以占用到300M以上,这个不太稳定,可能冲到350就被杀掉了。
可以在收到内存警告的时候自己的程序内部做些内存释放处理。 另外可能在内存紧张时设备的cpu也非常紧张或正在超频,那你即使在程序中对系统内存警告进行了处理,基本上也于事无补了,会crash。因为系统的内存警告有一定的滞后性,你收到后再处理,可能已经晚了,再加上cpu没空处理,再延后些就更不行了。所以以上我说的两个可能的最高值也不太可靠。
你也可以用intruments实时跑一下,看下内存到多大时收到警告级别,控制下自己的内存,也可以用直接读取当前设备中自己的程序占内存和设备剩余内存进行实时处理,对自己的程序进行内存处理,防止被杀掉。这种方式比收到警告再处理可靠多了,目前我们内存占用大的程序基本上用这种方式处理,不理会系统的内存警告。
因为我最近在做ipad的程序,所以对ipad1和ipad2的内存稍微了解点,iphone各版本处理方式一样,只是内存占用不太一样。iphone4和4s的内存与ipad2是一样的。
iPad2可以占用到300M以上,这个不太稳定,可能冲到350就被杀掉了。
可以在收到内存警告的时候自己的程序内部做些内存释放处理。 另外可能在内存紧张时设备的cpu也非常紧张或正在超频,那你即使在程序中对系统内存警告进行了处理,基本上也于事无补了,会crash。因为系统的内存警告有一定的滞后性,你收到后再处理,可能已经晚了,再加上cpu没空处理,再延后些就更不行了。所以以上我说的两个可能的最高值也不太可靠。
你也可以用intruments实时跑一下,看下内存到多大时收到警告级别,控制下自己的内存,也可以用直接读取当前设备中自己的程序占内存和设备剩余内存进行实时处理,对自己的程序进行内存处理,防止被杀掉。这种方式比收到警告再处理可靠多了,目前我们内存占用大的程序基本上用这种方式处理,不理会系统的内存警告。
因为我最近在做ipad的程序,所以对ipad1和ipad2的内存稍微了解点,iphone各版本处理方式一样,只是内存占用不太一样。iphone4和4s的内存与ipad2是一样的。
这个跟iOS系统版本、硬件版本都有关。但512M那是相当不靠谱的,iOS系统就不占内存了吗?App运行时,资源文件所占的空间可以相对大一点(不一定都加载到内存),但
动态开辟的内存超过20M在iPad1代上就很不稳定。
根据 http://stackoverflow.com/上的说法,App占用的内存空间可以是as much as you want, until the OS complains。然后会有人说,可以使用的内存很大,其实是一种误解,到现在人家Apple也没有说自己的内存管理规则,也不告诉你iOS系统在运行时所占的空间、后台保留程序的内存保有量,App运行时,并不是一定要把资源全部加载到内存,App运行时真正在内存中占的空间是动态的,它能够使用的内存也是动态的。
根据 http://stackoverflow.com/上的说法,App占用的内存空间可以是as much as you want, until the OS complains。然后会有人说,可以使用的内存很大,其实是一种误解,到现在人家Apple也没有说自己的内存管理规则,也不告诉你iOS系统在运行时所占的空间、后台保留程序的内存保有量,App运行时,并不是一定要把资源全部加载到内存,App运行时真正在内存中占的空间是动态的,它能够使用的内存也是动态的。
建议不要超过 10M. 如果用户 只运行一个程序 内存是用可以到 30M 左右.
不过这概率 几乎不可能.
一般 超过 10M 就会 memory warning L1 系统会 kill 一些不用的 view
内存管理 是门学问. 呵呵
不过这概率 几乎不可能.
一般 超过 10M 就会 memory warning L1 系统会 kill 一些不用的 view
内存管理 是门学问. 呵呵
转载StackOverflow上面的回答
iphone - ios app maximum memory budget
做了一些测试如下,不是官方数据
iPad1: 127MB/256MB/49% (crash amount/total amount/percentage of total)
iPad2: 275MB/512MB/53%
iPad3: 645MB/1024MB/62%
iPad4: 585MB/1024MB/57% (iOS 8.1)
iPad Mini 1st Generation: 297MB/512MB/58%
iPad Mini retina: 696MB/1024MB/68% (iOS 7.1)
iPad Air: 697MB/1024MB/68%
iPad Air 2: 1195MB/2048MB/58% (iOS 8.x)
iPod touch 4th gen: 130MB/256MB/51% (iOS 6.1.1)
iPod touch 5th gen: 286MB/512MB/56% (iOS 7.0)
iPhone4: 325MB/512MB/63%
iPhone4S: 286MB/512MB/56%
iPhone5: 645MB/1024MB/62%
iPhone5S: 646MB/1024MB/63%
iPhone6: 645MB/1024MB/62% (iOS 8.x)
iPhone6+: 645MB/1024MB/62% (iOS 8.x)
iPhone6s: 1195MB/2048MB/58% (theoretical, untested)
iPhone6s+: 1195MB/2048MB/58% (theoretical, untested)
iphone - ios app maximum memory budget
做了一些测试如下,不是官方数据
iPad1: 127MB/256MB/49% (crash amount/total amount/percentage of total)
iPad2: 275MB/512MB/53%
iPad3: 645MB/1024MB/62%
iPad4: 585MB/1024MB/57% (iOS 8.1)
iPad Mini 1st Generation: 297MB/512MB/58%
iPad Mini retina: 696MB/1024MB/68% (iOS 7.1)
iPad Air: 697MB/1024MB/68%
iPad Air 2: 1195MB/2048MB/58% (iOS 8.x)
iPod touch 4th gen: 130MB/256MB/51% (iOS 6.1.1)
iPod touch 5th gen: 286MB/512MB/56% (iOS 7.0)
iPhone4: 325MB/512MB/63%
iPhone4S: 286MB/512MB/56%
iPhone5: 645MB/1024MB/62%
iPhone5S: 646MB/1024MB/63%
iPhone6: 645MB/1024MB/62% (iOS 8.x)
iPhone6+: 645MB/1024MB/62% (iOS 8.x)
iPhone6s: 1195MB/2048MB/58% (theoretical, untested)
iPhone6s+: 1195MB/2048MB/58% (theoretical, untested)