一.看了很多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