iOS的任務管理和記憶體管理,跟windows是有很大差别的。很多FY習慣于用 windows的思維去看待IOS。 WIndows大家都知道,視窗開的越多,系統越慢,為什麼呢?因為所有視窗都在運作,CPU占用率高;并且都占記憶體。可用記憶體不足還會迫使系統使用硬碟充當虛拟記憶體,硬碟頻繁讀寫當然會多耗電,并且硬碟速度也比較慢。iOS則不同。首先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