关于IOS的多任务以及内存管理

一.看了很多FY为自己的可用内存是350MB还是380MB纠结,为了多优化出一点可用内存费脑筋。
     IOS的任务管理和内存管理,跟windows是有很大差别的。很多FY习惯于用 windows的思维去看待IOS。 WIndows大家都知道,窗口开的越多,系统越慢,为什么呢?因为所有窗口都在运行,CPU占用率高;并且都占内存。可用内存不足还会迫使系统使用硬盘充当虚拟内存,硬盘频繁读写当然会多耗电,并且硬盘速度也比较慢。
     IOS则不同。首先IOS的后台任务,除了极少数可以后台运行之外(比如音乐播放),绝大多数在后台都是挂起的。比如极品飞车,切到后台后马达轰鸣声就没有了,切换回来后得点“继续”才能继续跑。这类软件让它后台继续运行除了徒增耗电之外,没有任何意义。你总不希望极品飞车在切到后台时赛车还继续横冲直撞吧?
     既然软件在后台挂起,当然就不占用CPU,也就不会耗电。软件在后台挂起,不占CPU,但总该占内存吧?多占内存会不会耗电?会不会拖慢系统
?  答案仍然是:不会。
     IOS没有为IPA准备虚拟内存。如果前台软件内存不够用,IOS会直接释放后台软件所占用的内存,并不会像windows那样用硬盘虚拟内存(引起耗电增加)。而释放一块内存很简单,就是把内存块的某个标志由“占用”改为“空闲”即可,内存的内容直接废弃丢掉,不用交换到闪存,速度很快。 (这类似于文件删除,只是在文件名打个删除标记而已,并没有真正把文件内容删掉,这样一来,你删一个几G的文件,和删一个几K的文件速度一样快)
可见,我们使用windows的经验不适用于IOS。
      释放后台哪个软件的内存也有讲究。 有些后台软件被释放后会有严重后果,比如游戏软件,被释放后软件就结束了,切换回来就等于重新开始,游戏进度丢失。
有些软件则无关紧要。比如电子书软件,保留内存被释放后,软件可以只保留一个书签,切换回来可以重新加载内容,继续阅读。比如sarafi浏览器,所占内存被释放,切换回来无非是页面重新加载,不会引起严重后果。 IOS会优先释放那些对内存不敏感的后台软件。
对于已经切换到后台,既不占CPU并且内存又被释放的软件,事实上软件已经结束了,这样的后台软件更加不可能耗电。双击HOME看到的后台任务列表,大多数是这样的软件。
     说了那么多,就是说明:IOS可以任意开软件而不用刻意去结束它。事实上IOS软件连个退出功能都没有,以至于有的FY抱怨,苹果IOS设计怎么一点都不人性化?要退出一个软件,得双击HOME,再长按下面的图标,图标抖动后再按叉叉,麻烦死了。其实看了前面说的就知道了,IOS的软件根本不需要退出。
     其实苹果IOS多任务设计的目的,是让你忘掉多任务的存在,像IOS 3.x的单任务一样使用多任务,想运行哪个软件就运行它,不想运行就直接按HOME,无论后台开多少个软件,都不会拖慢前台软件(这本来嘛,后台都挂起状态不占CPU)。这一点对windows来说是难以想象的,但苹果的确是做到了。 并不是Windows无能,而是因为Windows是用来干活用的,需要全能的多任务,IOS只是一个手机操作系统,侧重点不同。  
   二.  部分FY对IOS内存空载和满载的耗电相同有疑问,认为:内存空载省电,满载多耗电。 
     这种看法是不对的。所谓空载和满载,是对操作系统来说的。而对于内存芯片电路而言,看到的只是0和1,就算是空闲的内存单元,也有0和1在里面,它必须忠实地保存所有数据,Iphone4有512MB的内存,只要一开机,芯片就必须一直保存通电以保存512MB的数据。不可能会因为操作系统认为有空闲内存,就会去切断那些空闲内存单元的电来省电。以电脑为例,你有两根内存条,一开机这两根内存条就得全部通电。不会因为你有大量空闲内存,主板就对其中一条内存条断电,然后再因为系统需要更多的内存空间而对其重新加电。
    认为内存满载就会增加耗电,仍然是windows的惯性思维。再说一遍:windows系统中,内存满载,系统就会使用硬盘做虚拟内存,所以耗电增加并且速度减慢;IOS却不会使用硬盘做虚拟内存,而是直接释放部分后台软件占用的内存,直到内存够分配为止。
因此内存空载与满载,对于IOS来说耗电没有区别。由于内存释放时是直接释放,其内容直接丢弃而不需要保存到硬盘(这跟windows不一样),因此内存空载与满载对IOS来说,速度也没有区别。

三. 部分FY以开不开后台耗电有明显区别为依据。

     关于这一点,我再说一下: 论坛上有人关闭所有后台,关闭通知,甚至开了飞行模式,一晚上待机仍然不见10%以上的电。百思不得其解。也有人什么都不懂什么都不管什么都不关,傻人有傻福,一晚上待机仍然100%的电。
     耗电问题因人而异,不能一概而论。 就我自己而言,只开2G信号待机,开通知,故意留几个大型游戏在后台不关闭,一晚上掉1%。事实上,后台游戏你切换回来,全部会处于暂停状态,全部得点屏幕上的Resume才能继续,事实就可以说明:游戏在后台是暂停的。一个完全暂停的后台任务如果还能让它继续跑电做无用功,你也太小看苹果的系统设计师了。
    看看植物战僵尸的游戏,切换到后台再切换回来的画面,看到Game Paused的字样没有?游戏在后台完全暂停了。知道直到你点resume,才会继续。 所有支持原生后台的的游戏,都是这样。
再看看苹果官方的权威解释,大家如果外语还凑合的话,应该能看懂:
http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
Executing Code in the Background
Most applications that enter the background state are moved to the suspended state shortly thereafter. While in this state, the application does not execute any code and may be removed from memory at any time. Applications that provide specific services to the user can request background execution time in order to provide those services.
(本人简单翻译一下):进入后台的大多数应用,状态会很快变成挂起。在此状态下,应用不执行任何代码,并随时可能被移出内存。(后面的不翻译了)
看了苹果官方的解释之后,大家对后台软件是否还继续耗电以及占用内存还有疑问吗?一个连运行内存都随时可能被剥夺的后台软件,有什么可能继续占用CPU,继续耗电?

四.是不是后台管理是完全多余的?

     当然也不是。有些可以真正后台运行的软件,比如iPod音乐播放,如果你既把它放后台,又把音量关到最小,那么它就会持续耗电并且不引起你注意(也不是完全没有痕迹,起码顶部状态栏有个三角形的正在播放图标)。
     还有一些不支持后台的IOS3.x的老软件,用BackGround改成支持后台后,也有可能在后台悄悄运行,这种情况也需要做后台管理。 以上两点是部分FY在回帖中的补充,在此也谢谢这些FY。

http://bbs.weiphone.com/read-htm-tid-1905615.html

by gqzhu

posted @ 2012-04-23 16:47  iPhone Dev  阅读(1533)  评论(0编辑  收藏  举报