開發(fā)應(yīng)用的每一步,都需要考慮你的設(shè)計(jì)選擇對(duì)應(yīng)用整體性能的影響。電量使用和內(nèi)存消耗是iOS應(yīng)用重點(diǎn)考慮的因素涂籽。當(dāng)然還有很多值的考慮的因素。接下來的部分砸抛,描述了整個(gè)開發(fā)過程需要考慮的因素评雌。
減少應(yīng)用的電量消耗
耗電量一直是移動(dòng)設(shè)備的問題。iOS的電量管理系統(tǒng)通過關(guān)閉當(dāng)前不使用的硬件功能來節(jié)省電量直焙。你可以通過優(yōu)化使用下列功能來幫助延長電池壽命:
- CPU
- Wi-Fi, Bluetooth, 以及基帶(EDGE, 3G)無線電
- Core Location框架
- 加速計(jì)
- 磁盤
優(yōu)化的目標(biāo)應(yīng)該是用最少的電量做最多的事景东。你應(yīng)該始終使用Instruments來優(yōu)化應(yīng)用的算法。但是奔誓,即便是最優(yōu)化的算法也會(huì)對(duì)設(shè)備的電池壽命產(chǎn)生負(fù)面的影響斤吐。因此在編寫代碼的時(shí)候要考慮下面的準(zhǔn)則:
- 避免進(jìn)行要求輪詢的工作。輪詢會(huì)阻止CPU進(jìn)入休眠狀態(tài)厨喂『痛耄可以使用NSRunLoop 或 NSTimer類取代輪詢來安排必要的工作。
- 盡可能的將UIApplication共享對(duì)象的idleTimerDisabled屬性設(shè)置為NO蜕煌∨哨澹空閑定時(shí)器會(huì)在設(shè)備不操作一段時(shí)間后關(guān)閉屏幕。如果應(yīng)用不需要讓屏幕亮著斜纪,就讓系統(tǒng)關(guān)掉它颁褂。如果應(yīng)用因?yàn)槠聊魂P(guān)閉而產(chǎn)生副作用故响,則應(yīng)該修改代碼來消除副作用,而不必禁用空閑定時(shí)器颁独。
- 盡可能地合并工作,以便最大化的延長空閑時(shí)間伪冰。一般來說誓酒,一次執(zhí)行一組計(jì)算任務(wù)所耗電量要比在較長時(shí)間內(nèi)多次執(zhí)行一小部分來的更少。因?yàn)橹芷谛缘膱?zhí)行少量任務(wù)會(huì)頻繁的喚醒CPU執(zhí)行任務(wù)贮聂。
- 避免頻繁的訪問磁盤靠柑。例如,如果應(yīng)用保存狀態(tài)信息到磁盤吓懈,只需要在狀態(tài)信息改變的時(shí)候進(jìn)行即可歼冰,并盡可能的合并更改來避免頻繁的寫入小的改變。
- 不要超出需求的繪制屏幕耻警。對(duì)于耗電量來說繪制是一個(gè)昂貴的操作隔嫡。不要依靠硬件來調(diào)節(jié)幀速率。要根據(jù)實(shí)際需要來繪制幀甘穿。
- 如果你使用UIAccelerometer 類來接收常規(guī)加速計(jì)事件腮恩,那在你不需要時(shí)禁止傳遞這些事件。類似的温兼,將事件傳送的頻率設(shè)置為你需要的最小值秸滴。更多信息,參見Event Handling Guide for UIKit Apps募判。
傳輸?shù)骄W(wǎng)絡(luò)的數(shù)據(jù)越多荡含,運(yùn)行無線電所消耗的電量就越大。事實(shí)上届垫,訪問網(wǎng)絡(luò)是功耗最大的操作释液。你可以通過下面的指導(dǎo)來最小化使用時(shí)間。
- 只在必要的時(shí)候才連接外部網(wǎng)絡(luò)服務(wù)敦腔,并且不要輪詢這些服務(wù)均澳。
- 當(dāng)你必須連接網(wǎng)絡(luò)的時(shí)候,根據(jù)需要最小化數(shù)據(jù)傳輸符衔。使用緊湊的數(shù)據(jù)格式找前,不要包含被忽略的多余內(nèi)容。
- 短暫大量的傳輸要好于長時(shí)少量的傳輸判族。系統(tǒng)在檢測到網(wǎng)絡(luò)信號(hào)活躍度不夠的時(shí)候躺盛,會(huì)關(guān)閉Wi-Fi或者基站無線電。當(dāng)系統(tǒng)在長時(shí)間的傳輸數(shù)據(jù)的時(shí)候形帮,它比起在短時(shí)間內(nèi)傳遞同樣數(shù)量的數(shù)據(jù)所消耗的電量更少槽惫。當(dāng)使用NSURLSession類來排列多個(gè)上傳和下載的任務(wù)時(shí)周叮,將它們安排進(jìn)隊(duì)列,而不是等一個(gè)完成了再開始第二個(gè)界斜。系統(tǒng)會(huì)自動(dòng)管理這個(gè)隊(duì)列以最有效的方式執(zhí)行仿耽。
- 盡可能的使用Wi-Fi來連接網(wǎng)絡(luò)。Wi-Fi要比蜂窩無線電小號(hào)更少的能量各薇。
- 如果你使用Core Location框架來采集位置數(shù)據(jù)项贺,一旦有可能就禁用位置更新,并且設(shè)置合適的距離過濾器和精度等級(jí)的值峭判。Core Location 使用GPS开缎、基站、以及Wi-Fi網(wǎng)絡(luò)來確定用戶的位置林螃。雖然Core Locatioin盡量少的使用這些無線電奕删,但是設(shè)置合適的精度和過濾器的值可以讓Core Location在不需要的時(shí)候完全關(guān)閉硬件。更多信息疗认,參見Location and Maps Programming Guide完残。
Instruments應(yīng)用包含多個(gè)收集點(diǎn)亮相關(guān)信息的工具。你可以使用這些工具來收集關(guān)于電量消耗的信息侮邀,并收集對(duì)諸如Wi-Fi和藍(lán)牙無線點(diǎn)坏怪、GPS服務(wù)、顯示绊茧、以及CPU等硬件的特定測量數(shù)據(jù)铝宵。你可以啟用在設(shè)備上的Energy Diagnostics Logging(能量診斷日志)來收集信息。關(guān)于使用Instruments來搜集電量相關(guān)數(shù)據(jù)的信息华畏,參見Instruments User Guide鹏秋。關(guān)于如何啟用Energy Diagnostics Logging,參見Instruments Help亡笑。
高效的使用內(nèi)存
鼓勵(lì)應(yīng)用盡可能少的使用內(nèi)存侣夷,以便系統(tǒng)可以保留更多應(yīng)用在內(nèi)存中,或者將跟多的內(nèi)存留給前臺(tái)應(yīng)用仑乌。大量的可用系統(tǒng)空閑內(nèi)存和應(yīng)用的性能之間存在著直接的關(guān)系百拓。較少的可用系統(tǒng)內(nèi)存會(huì)在功能請求內(nèi)存的時(shí)候出現(xiàn)問題。
為了確蔽酰總是有足夠的可用內(nèi)存衙传,你應(yīng)該最小化應(yīng)用的內(nèi)存使用,并且當(dāng)系統(tǒng)要求你釋放內(nèi)存的時(shí)候做出響應(yīng)厕九。
觀察低內(nèi)存警告
當(dāng)系統(tǒng)向應(yīng)用發(fā)送低內(nèi)存警告的時(shí)候蓖捶,立刻響應(yīng)。低內(nèi)存警告是移你不需要的對(duì)象的引用的機(jī)會(huì)扁远。響應(yīng)這些警告至關(guān)重要俊鱼,因?yàn)閼?yīng)用這可能會(huì)導(dǎo)致應(yīng)用終止刻像。系統(tǒng)使用下面幾個(gè)APIs來向應(yīng)用傳遞內(nèi)存警告:
- 應(yīng)用委托的applicationDidReceiveMemoryWarning:方法。
- UIViewController類的didReceiveMemoryWarning方法并闲。
- UIApplicationDidReceiveMemoryWarningNotification 通知细睡。
- 調(diào)度DISPATCH_SOURCE_TYPE_MEMORYPRESSURE類型資源。這個(gè)技術(shù)是唯一能讓你可以區(qū)分內(nèi)存壓力嚴(yán)重性的技術(shù)帝火。
當(dāng)接到其中任意一個(gè)警告的時(shí)候纹冤,你應(yīng)該通過里脊釋放不必要的內(nèi)存來響應(yīng)。使用這些警告來清理緩存和釋放圖片购公。如果你有沒有在使用的大型數(shù)據(jù)結(jié)構(gòu),把這些結(jié)構(gòu)寫入磁盤雁歌,并釋放數(shù)據(jù)的內(nèi)存副本宏浩。
如果你的數(shù)據(jù)模型包括了已知的可清除的資源,你可以為UIApplicationDidReceiveMemoryWarningNotification通知提供一個(gè)相應(yīng)的管理對(duì)象注冊靠瞎,并直接刪除對(duì)它的可清除資源的強(qiáng)引用比庄。這樣可以直接處理這個(gè)通知而無須路由整個(gè)內(nèi)存警告。
注意:你可以在低內(nèi)存條件下使用iOS模擬器中的Simulate Memory Warning (模擬內(nèi)存警告)命令來測試應(yīng)用行為乏盐。
減少應(yīng)用的內(nèi)存占用
從占用較少的內(nèi)存開始佳窑,之后根據(jù)需要擴(kuò)大應(yīng)用的內(nèi)存占用空間。表7-1列出了一些如何減少應(yīng)用整體內(nèi)存專用的技巧父能。
表7-1 減少應(yīng)用內(nèi)存占用的技巧
技巧 | 采取的行動(dòng) |
---|---|
消除內(nèi)存占用 | 因?yàn)閮?nèi)存在iOS中是至關(guān)重要的資源神凑,應(yīng)用不應(yīng)該有內(nèi)存泄露。使用Instruments應(yīng)用來跟蹤代碼中的泄漏何吝,可以使用模擬器也可以使用真實(shí)設(shè)備溉委。更多關(guān)于使用Instruments的信息,參見Instruments User Guide爱榕。 |
盡可能小的制作資源文件 | 文件位于磁盤瓣喊,但是使用的時(shí)候必須加載到內(nèi)存中。壓縮圖片文件黔酥,使它們盡可能的小藻三。(使用pngcrush工具把圖片壓縮為PNG格式,一種iOS應(yīng)用偏愛的圖片格式跪者。)你可以使用NSPropertyListSerialization類以二進(jìn)制的格式編寫更小的property list文件棵帽。 |
對(duì)于設(shè)置大型數(shù)據(jù)集使用Core Data或者SQLite | 如果應(yīng)用操作大量結(jié)構(gòu)化數(shù)據(jù),應(yīng)該使用Core Data或者SQLite數(shù)據(jù)庫代替文件來進(jìn)行數(shù)據(jù)的持久化坑夯。上述兩種方式可以提供高效的方式管理大型數(shù)據(jù)集岖寞,而無需每次都將整個(gè)數(shù)據(jù)寫入內(nèi)存。 |
懶加載資源 | 除非真的需要柜蜈,否則不要加載資源文件仗谆。預(yù)選獲取資源文件可以節(jié)省時(shí)間指巡,但實(shí)際上拖慢了應(yīng)用的速度。另外隶垮,如果你最終不使用資源礼华,加載它就是浪費(fèi)內(nèi)存廊敌。 |
明智的分配內(nèi)存
表7-2 列出了在應(yīng)用用提高內(nèi)存使用率的技巧。
表7-2 分配內(nèi)存的技巧
技巧 | 采取的行動(dòng) |
---|---|
限制資源文件的大小 | 可以用小的資源文件就避免用大的。不要使用高分辨率圖片佩厚,使用基于iOS設(shè)備的合適的尺寸。如果你必須使用大量資源文件昌讲,找到一種方式饶火,只在某一時(shí)刻提供當(dāng)時(shí)需要的文件的部分內(nèi)容。例如威始,比起加載整個(gè)文件到內(nèi)存中枢纠,使用mmap和munmap函數(shù)來映射文件的部分內(nèi)容寫入內(nèi)存或從內(nèi)存中刪除。更多關(guān)于在內(nèi)存中映射文件的信息黎棠,參見File-System Performance Guidelines晋渺。 |
避免無限問題集 | 無限問題集可能會(huì)要求大量數(shù)據(jù)的計(jì)算。如果這樣脓斩,應(yīng)用是不能夠完成計(jì)算的木西。應(yīng)用應(yīng)該盡量避免這中情況出現(xiàn),并問題工作在已知的內(nèi)存限制內(nèi)随静。關(guān)于ARC和內(nèi)存管理的具體信息八千,參見Transitioning to ARC Release Notes。 |
(未完待續(xù) ......)