*導(dǎo)讀: *
如果你只會(huì)UITabelView的性能優(yōu)化唠摹,請(qǐng)不要說(shuō)你懂iOS性能優(yōu)化建峭,下面是我開(kāi)發(fā)這么多年項(xiàng)目中會(huì)影響性能的點(diǎn),我想會(huì)對(duì)你的項(xiàng)目起到很大的作用
性能優(yōu)化主要有這些:
1、性能優(yōu)化:內(nèi)存優(yōu)化裂明、速度優(yōu)化;
2太援、代碼優(yōu)化(后續(xù)迭代)闽晦;
3、程序的體積可以優(yōu)化
一提岔、APP性能優(yōu)化
1仙蛉、UITableViewCell的優(yōu)化
我曾經(jīng)在博客中有詳細(xì)說(shuō)明 ,這里就不細(xì)說(shuō)了
http://www.ios520junge.com/2014/06/06/由淺入深精講uitabelview/ ?
**
**
**2碱蒙、網(wǎng)絡(luò)請(qǐng)求優(yōu)化
**
①利用第三方AFN時(shí)做網(wǎng)絡(luò)隔離荠瘪,減少對(duì)第三方的依賴(lài)性;
②UI功能設(shè)計(jì)時(shí)赛惩,減少同一時(shí)間多次網(wǎng)絡(luò)請(qǐng)求的可能性哀墓;
③請(qǐng)求數(shù)據(jù)用JSON,如果用XML代表在網(wǎng)絡(luò)數(shù)據(jù)解析這塊會(huì)浪費(fèi)很多性能喷兼,兩者都是常見(jiàn)的數(shù)據(jù)編碼方式麸祷,壓縮模式的效率在很大程度上取決于待壓縮數(shù)據(jù),而通常情況下褒搔,JSON都是一種最高效的模式
**
**
**3阶牍、圖片加載的優(yōu)化
**
對(duì)于這個(gè)可以深入研究下SDWebImage框架的底層實(shí)現(xiàn)
4、在編碼過(guò)程中
①應(yīng)該做懶加載星瘾、單例走孽、封裝處理的有沒(méi)有處理,如:多個(gè)控制器基礎(chǔ)搭建很像琳状,有沒(méi)有抽baseController磕瓷;
②切圓角圖片時(shí),用的什么技術(shù)(直接切圓角和用貝塞爾路徑進(jìn)行畫(huà)是有很大影響的,后續(xù)會(huì)提供專(zhuān)門(mén)的文章進(jìn)行說(shuō)明)困食,切完后有沒(méi)有做緩存處理
補(bǔ)充:
5边翁、盡量把views設(shè)置為完全不透明
如果你有透明的Views你應(yīng)該設(shè)置它們的opaque(不透明)屬性為YES,如:黑色半透明的可以設(shè)置為一個(gè)灰色不透明的View替代硕盹,原因是這會(huì)使系統(tǒng)用一個(gè)最優(yōu)的方式渲染這些views
Apple的文檔對(duì)于為圖片設(shè)置透明屬性的描述是:
opaque
這個(gè)屬性給渲染系統(tǒng)提供了一個(gè)如何處理這個(gè)view的提示符匾;YES, 渲染系統(tǒng)就認(rèn)為這個(gè)view是完全不透明的瘩例,這使得渲染系統(tǒng)優(yōu)化一些渲染過(guò)程和提高性能啊胶。如果設(shè)置為NO,渲染系統(tǒng)正常地和其它內(nèi)容組成這個(gè)View
只要一個(gè)視圖的不透明度小于1,就會(huì)導(dǎo)致blending(混合像素顏色的計(jì)算)
垛贤,blending操作在iOS的圖形處理器(GPU)中完成的焰坪。舉個(gè)例子,我們把兩個(gè)圖層疊加在一起,如果第一個(gè)圖層的有透明效果,則最終像素的顏色計(jì)算需要將第二個(gè)圖層也考慮進(jìn)來(lái)。這一過(guò)程即為Blending聘惦。
為什么Blending會(huì)導(dǎo)致性能的損失某饰?
如果一個(gè)圖層是完全不透明的,則系統(tǒng)直接顯示該圖層的顏色即可。而如果圖層是帶透明效果的,則會(huì)引入更多的計(jì)算,因?yàn)樾枰严旅娴膱D層也包括進(jìn)來(lái),進(jìn)行混合后顏色的計(jì)算善绎。
6黔漂、避免過(guò)于龐大的XIB
加載一個(gè)XIB的時(shí)候所有內(nèi)容都被放在了內(nèi)存里,包括任何圖片涂邀,不會(huì)即刻用到的view瘟仿,你這就是在浪費(fèi)寶貴的內(nèi)存資源了箱锐,
storyboard僅在需要時(shí)實(shí)例化一個(gè)view controller.
7比勉、不要阻塞主線程
大部分阻礙主進(jìn)程的情形是你的app在做一些牽涉到讀寫(xiě)外部資源的I/O操作,比如存儲(chǔ)或者網(wǎng)絡(luò)
8驹止、不要在Image Views中調(diào)整圖片大小
保證圖片的大小和UIImageView的大小相同浩聋。在運(yùn)行中縮放圖片是很耗費(fèi)資源的,特別是UIImageView嵌套在UIScrollView中的情況下臊恋;
如果圖片是從遠(yuǎn)端服務(wù)加載的你不能控制圖片大小衣洁,用background thread,縮放一次抖仅,然后在UIImageView中使用縮放后的圖片
9坊夫、選擇正確的Collection
Apple有一個(gè) Collections Programming Topics(集合的編程問(wèn)題) 的文檔詳盡介紹了可用的classes間的差別和你該在哪些場(chǎng)景中使用它們,如:
* Arrays: 有序的一組值撤卢。使用index來(lái)lookup(查找)很快环凿,使用value lookup很慢, 插入/刪除很慢放吩。
* Dictionaries: 存儲(chǔ)鍵值對(duì)智听。 用鍵來(lái)查找比較快。
* Sets: 無(wú)序的一組值。用值來(lái)查找很快到推,插入/刪除很快考赛。
10、重用和延遲加載(lazy load) Views
點(diǎn)擊一個(gè)按鈕的時(shí)候需要呈現(xiàn)一個(gè)view的場(chǎng)景:
- 創(chuàng)建并隱藏這個(gè)view當(dāng)這個(gè)screen加載的時(shí)候莉测,當(dāng)需要時(shí)顯示它颜骤;
- 當(dāng)需要時(shí)才創(chuàng)建并展示。
方案一:更加消耗內(nèi)存悔雹。但app操作更靈敏
方案二:消耗更少內(nèi)存复哆,但是會(huì)在點(diǎn)擊按鈕的時(shí)候比第一種稍顯卡頓
選擇方案:點(diǎn)擊按鈕時(shí),懶加載這個(gè)view腌零,這樣就第一次卡頓梯找,以后都不卡頓
11、Cache
緩存那些不大可能改變但是需要經(jīng)常讀取的東西益涧。
如:遠(yuǎn)端服務(wù)器的響應(yīng)锈锤,圖片,甚至計(jì)算結(jié)果(UITableView的行高)
太多了闲询,會(huì)在《iOS性能優(yōu)化(精二)》中更新……
--
二久免、代碼優(yōu)化
一個(gè)app的開(kāi)發(fā)過(guò)程是短暫的。后面的是永無(wú)止境的維護(hù)扭弧,更新阎姥,迭代;
節(jié)省我們后期維護(hù)代碼的時(shí)間:
- 代碼編寫(xiě)規(guī)范:聲明鸽捻、方法實(shí)現(xiàn)呼巴、懶加載、代理寫(xiě)在哪個(gè)地方
- 代碼有沒(méi)有嚴(yán)格遵守MVC或者M(jìn)VVM設(shè)計(jì)模式御蒲,打造輕量級(jí)的Contreller
- 方法名衣赶、屬性名取好,項(xiàng)目文檔編寫(xiě)清晰