- 如果要做一個優(yōu)秀的iOS app, 工程師的職責(zé), 就是盡可能的優(yōu)化App的性能.
- 本文絕大多數(shù)內(nèi)容來自Macelo Fabri的文章, 重新進(jìn)行了組織.
- 本文沒有提Instruments,但是,它其實是性能優(yōu)化的前提。他正如易學(xué)中的診斷階段,下面列出的都是治療的配方。
1. 內(nèi)存
1.1 使用ARC管理內(nèi)存
在大多數(shù)情況下, 都應(yīng)該使用ARC, 因為:
- 使用ARC, 當(dāng)你的對象不用時, 系統(tǒng)會盡快的幫你進(jìn)行release. MRC的話未必能保證.
- 使用ARC, 能幫你減少內(nèi)存泄露.
1.2 選用合適的集合
- NSArray, NSet, NSDictionary, 適用場景不同, 謹(jǐn)慎選擇.
1.3 處理操作系統(tǒng)的內(nèi)存警告
- 其實這個不能說是性能問題, 而是你的應(yīng)用在前臺會掛掉, 或者被系統(tǒng)從后臺清理掉.
1.4 使用 Autorelease Pool
2. UI
2.1 盡量使用 reuseIdentifier
- 對于UITableView和UICollectionView中的Cell等, 使用reuseIdentifier, 可以避免每次都重新創(chuàng)建Cell.
2.2 盡可能設(shè)置Views 為 Opaque(不透明)
- 如果你的View不是透明的, 那就顯式的設(shè)置Opaque為YES, 這樣系統(tǒng)在繪制的時候, 就可以進(jìn)行一定的優(yōu)化. 雖然設(shè)置起來很繁瑣, 但是盡可能多的設(shè)置吧.
2.3 避免很大的XIBs文件
- 就算你只使用了XIBs文件中的一個view, 系統(tǒng)在加載XIBs文件的時候, 也會整個加載. 所以盡量保證每個XIBs文件中只有一個View. 但是StoryBoard沒有這個問題, 如果要將多個View放在一起, 盡量使用StoryBoard.
2.4 保證Images和UIImageView的大小相同(別縮放)
- 如果這兩者尺寸不一致, 顯示的時候就會發(fā)生縮放. 縮放是耗時操作, 在滾動視圖中尤其耗時.
2.5 重用或者懶加載Views
- 這個沒啥好說的... ...
2.6 考慮使用繪圖函數(shù)
- 減少了圖片的使用, 適當(dāng)考慮.
2.7 采用合適的手段設(shè)置背景圖片
- 對于重復(fù)鋪滿的背景圖片, 可以使用UIColoer進(jìn)行設(shè)置.
2.8 使用Shadow Path設(shè)置陰影
2.9 優(yōu)化你的Table Views
3. 多線程
3.1 不要阻塞主線程
- 主線程在處理UI, 如果進(jìn)行耗時操作, 發(fā)生了阻塞, 就等著卡吧.
3.2 小心在線程里大量的分配內(nèi)存空間
- 堆是有鎖的, 每一個時刻, 只能有一個線程進(jìn)行內(nèi)存分配操作.
4. 網(wǎng)絡(luò)
4.1 啟用GZIP 壓縮
- iOS和Web服務(wù)器對GZIP的支持很好, 尤其對于文本類(Json, XML)的壓縮率很高, 能壓縮到原來的1/5左右, 所以值得采用.
4.2 減少不必要的Web數(shù)據(jù)傳輸
- 如果只需要用戶名和頭像, 就別把性別, 城市, 興趣愛好什么一起傳過來.
5. 持久化
5.1. 選擇正確的數(shù)據(jù)存儲方式
- NSUserDefaults
- 結(jié)構(gòu)化文件: XML, JSON, or Plist format
- 歸檔: Archive using NSCoding
- 數(shù)據(jù)庫: SQLite
- Core Data.
6. 其他
6.1緩存
- 通過內(nèi)存, 文件系統(tǒng), 數(shù)據(jù)庫對網(wǎng)絡(luò)數(shù)據(jù)等進(jìn)行緩存, 是提高性能的不二法則. 空間緯度上越近, 訪問越快.
6.2 重用創(chuàng)建代價很大的對象
- 不需解釋, 這也是為什么單例模式的存在.
6.3 避免重復(fù)處理數(shù)據(jù)
- 比如解析Json數(shù)據(jù), 比如計算表格高度
6.4 選擇合適的數(shù)據(jù)格式(XML, JSON)
- 一般來說xml數(shù)據(jù)大, 但是支持校驗, 支持SAX解析, json數(shù)據(jù)小.
6.5 減少啟動時間
- 這對應(yīng)用體驗很重要
6.6 避免使用Date Formatters
- 這貨性能很差
6.7 啟用編譯器優(yōu)化選項
- 默認(rèn)的優(yōu)化器選項是 -Os, 最快最小。 但是如果不是專門進(jìn)行科學(xué)計算的應(yīng)用,你可以使用-Ofast,如果需要IEEE浮點運算,則可以使用-O3。這兩個選項通常只會增加百分之幾的應(yīng)用體積,但是性能會顯著提升。
6.8 啟用連接器優(yōu)化
- 通過LTO進(jìn)行連接優(yōu)化。普通的設(shè)置,只是在單個.m文件內(nèi)進(jìn)行優(yōu)化,啟用該選項后,會在項目的全局范圍內(nèi)進(jìn)行優(yōu)化。
6.9 使用Accelerate框架
- 這個庫里提供了很多數(shù)學(xué)函數(shù)庫,可以幫助你提升性能。