*導讀: *
如果你只會UITabelView的性能優化,請不要說你懂iOS性能優化,下面是我開發這么多年項目中會影響性能的點,我想會對你的項目起到很大的作用
性能優化主要有這些:
1、性能優化:內存優化、速度優化;
2、代碼優化(后續迭代);
3、程序的體積可以優化
一、APP性能優化
1、UITableViewCell的優化
我曾經在博客中有詳細說明 ,這里就不細說了
http://www.ios520junge.com/2014/06/06/由淺入深精講uitabelview/ ?
**
**
**2、網絡請求優化
**
①利用第三方AFN時做網絡隔離,減少對第三方的依賴性;
②UI功能設計時,減少同一時間多次網絡請求的可能性;
③請求數據用JSON,如果用XML代表在網絡數據解析這塊會浪費很多性能,兩者都是常見的數據編碼方式,壓縮模式的效率在很大程度上取決于待壓縮數據,而通常情況下,JSON都是一種最高效的模式
**
**
**3、圖片加載的優化
**
對于這個可以深入研究下SDWebImage框架的底層實現
4、在編碼過程中
①應該做懶加載、單例、封裝處理的有沒有處理,如:多個控制器基礎搭建很像,有沒有抽baseController;
②切圓角圖片時,用的什么技術(直接切圓角和用貝塞爾路徑進行畫是有很大影響的,后續會提供專門的文章進行說明),切完后有沒有做緩存處理
補充:
5、盡量把views設置為完全不透明
如果你有透明的Views你應該設置它們的opaque(不透明)屬性為YES,如:黑色半透明的可以設置為一個灰色不透明的View替代,原因是這會使系統用一個最優的方式渲染這些views
Apple的文檔對于為圖片設置透明屬性的描述是:
opaque
這個屬性給渲染系統提供了一個如何處理這個view的提示;YES, 渲染系統就認為這個view是完全不透明的,這使得渲染系統優化一些渲染過程和提高性能。如果設置為NO,渲染系統正常地和其它內容組成這個View
只要一個視圖的不透明度小于1,就會導致blending(混合像素顏色的計算)
,blending操作在iOS的圖形處理器(GPU)中完成的。舉個例子,我們把兩個圖層疊加在一起,如果第一個圖層的有透明效果,則最終像素的顏色計算需要將第二個圖層也考慮進來。這一過程即為Blending。
為什么Blending會導致性能的損失?
如果一個圖層是完全不透明的,則系統直接顯示該圖層的顏色即可。而如果圖層是帶透明效果的,則會引入更多的計算,因為需要把下面的圖層也包括進來,進行混合后顏色的計算。
6、避免過于龐大的XIB
加載一個XIB的時候所有內容都被放在了內存里,包括任何圖片,不會即刻用到的view,你這就是在浪費寶貴的內存資源了,
storyboard僅在需要時實例化一個view controller.
7、不要阻塞主線程
大部分阻礙主進程的情形是你的app在做一些牽涉到讀寫外部資源的I/O操作,比如存儲或者網絡
8、不要在Image Views中調整圖片大小
保證圖片的大小和UIImageView的大小相同。在運行中縮放圖片是很耗費資源的,特別是UIImageView嵌套在UIScrollView中的情況下;
如果圖片是從遠端服務加載的你不能控制圖片大小,用background thread,縮放一次,然后在UIImageView中使用縮放后的圖片
9、選擇正確的Collection
Apple有一個 Collections Programming Topics(集合的編程問題) 的文檔詳盡介紹了可用的classes間的差別和你該在哪些場景中使用它們,如:
* Arrays: 有序的一組值。使用index來lookup(查找)很快,使用value lookup很慢, 插入/刪除很慢。
* Dictionaries: 存儲鍵值對。 用鍵來查找比較快。
* Sets: 無序的一組值。用值來查找很快,插入/刪除很快。
10、重用和延遲加載(lazy load) Views
點擊一個按鈕的時候需要呈現一個view的場景:
- 創建并隱藏這個view當這個screen加載的時候,當需要時顯示它;
- 當需要時才創建并展示。
方案一:更加消耗內存。但app操作更靈敏
方案二:消耗更少內存,但是會在點擊按鈕的時候比第一種稍顯卡頓
選擇方案:點擊按鈕時,懶加載這個view,這樣就第一次卡頓,以后都不卡頓
11、Cache
緩存那些不大可能改變但是需要經常讀取的東西。
如:遠端服務器的響應,圖片,甚至計算結果(UITableView的行高)
太多了,會在《iOS性能優化(精二)》中更新……
--
二、代碼優化
一個app的開發過程是短暫的。后面的是永無止境的維護,更新,迭代;
節省我們后期維護代碼的時間:
- 代碼編寫規范:聲明、方法實現、懶加載、代理寫在哪個地方
- 代碼有沒有嚴格遵守MVC或者MVVM設計模式,打造輕量級的Contreller
- 方法名、屬性名取好,項目文檔編寫清晰