iOS程式碼效能優化

躍然發表於2016-02-26

程式碼效能優化:
入門級(這是些你一定會經常用在你app開發中的建議)
1. 用ARC管理記憶體
專案中目前正在使用
2. 在正確的地方使用reuseIdentifier
UITableView和UICollectionView使用時要注意單元格重用
3. 儘可能使Views不透明
將檢視的opaque屬性為YES,目前專案中設定沒有問題。
4. 避免龐大的XIB
Storyboards在單個人開發非常便利,但是不適合我們專案,否則所有時間都用來解決SVN衝突了。
我們專案中借鑑:一些簡單介面可以不使用XIB,例如:一個XIB中只有一個UITableView的情景,可以不建立XIB。
5. 不要block主執行緒
目前我們專案中一些複雜的資料處理及計算都直接處理,要多多使用如下模式:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // switch to a background thread and perform your expensive operation
    dispatch_async(dispatch_get_main_queue(), ^{
        // switch back to the main thread to update your UI
  
    });
});
  1. 在Image Views中調整圖片大小
    使用合適大小的圖片資源
  2. 選擇正確的Collection
  3. 開啟gzip壓縮
       使用gzip來減少與伺服器間資料量,可以做技術儲備
    中級(這些是你可能在一些相對複雜情況下可能用到的)
  4. 重用和延遲載入Views
  5. Cache, Cache, 還是Cache!
  6. 權衡渲染方法
  7. 處理記憶體警告
      目前專案中幾乎沒有針對記憶體警告的處理,原因是目前暫時還沒有發現因為記憶體警告而導致的Crash。要引起重視。記憶體警告時解決方案:將快取刪掉,同時要注意將上次選擇的狀態儲存在本地
  8. 重用大開銷的物件
        理論沒有問題。但是NSDateFormatter示例不合適,因為NSDateFormatter不是執行緒安全的,多個執行緒同時訪問NSDateFormatter會Crash,我個人建議特殊情況特殊處理,對於NSDateFormatter這種不是執行緒安全的,應該隨時使用隨時建立。
  9. 使用Sprite Sheets
    目前專案沒有涉及遊戲方面。
  10. 避免反覆處理資料
        從伺服器拿到資料以後,一次性處理好,然後展示。最好不要在展示的時候才處理資料。
  11. 選擇正確的資料格式
        目前我們專案中使用Json解析,沒有問題。
  12. 正確地設定Background Images
        使用UIColor的colorWithPatternImage也可以設定背景圖片,但是一定注意,colorWithPatternImage只使用一種情況:用小圖平鋪來建立背景,否則記憶體會急劇增大
  13. 減少使用Web特性
        專案中暫不涉及
  14. 設定Shadow Path
    設定陰影一定要加shadowPath,避免卡成狗
view.layer.shadowPath = [[UIBezierPath bezierPathWithRect:view.bounds] CGPath];
  1. 優化你的Table View
    • 正確使用reuseIdentifier來重用cells
    • 儘量使所有的view opaque,包括cell自身
    • 避免漸變,圖片縮放,後臺選人
    • 快取行高
    • 如果cell內現實的內容來自web,使用非同步載入,快取請求結果
    • 使用shadowPath來畫陰影
    • 減少subviews的數量
    • 儘量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然後快取結果
    • 使用正確的資料結構來儲存資料
    • 使用rowHeight, sectionFooterHeightsectionHeaderHeight來設定固定的高,不要請求delegate
    額,說的非常正確,我不知道說什麼好。
  2. 選擇正確的資料儲存選項
    進階級(這些建議只應該在你確信他們可以解決問題和得心應手的情況下采用)
  3. 加速啟動時間
    程式啟動時,除了介面上的操作,其他儘可能放在背景執行緒做。
    “避免過於龐大的XIB,因為他們是在主執行緒上載入的。所以儘量使用沒有這個問題的Storyboards吧!” 這句雖然說的對,但是不適合我們專案
  4. 使用Autorelease Pool
    在迴圈中,如果有很多autorelease物件,使用如下方案。注意@autoreleasepool要放在迴圈內部。
NSArray *urls = ;
for (NSURL *url in urls) {
    @autoreleasepool {
        NSError *error;
        NSString *fileContents = [NSString stringWithContentsOfURL:url
                                         encoding:NSUTF8StringEncoding error:&error];
        /* Process the string, creating and autoreleasing more objects. */
    }
}
  1. 選擇是否快取圖片
    一次性大圖片使用imageWithContentsOfFile載入,表格中或者反覆使用的圖片可以使用imageNamed。
  2. 儘量避免日期格式轉換
    NSDateFormatter仍然是坑

參考:
1. http://blog.jobbole.com/37984/

相關文章