有文事者,必有武備

6 id 與 NSObject,  instancetype

 https://www.jianshu.com/p/a1f377dfc85a

https://www.jianshu.com/p/3b7efa02bdf4

 

5 啓動優化總結

關於app啓動優化,可以從幾方面入手:

  1. 減少不必要的framework;
  2. 清理項目中沒有使用到的代碼、類,避免冗餘代碼;
  3. 慎用+load,第三方庫已經使用了夠多的+load方法(objection,rn…),在寫代碼時儘量用+initialize代替+load;
  4. 梳理流程,優化代碼,啓動模塊化。耗時操作不要在主線程;
  5. 本地緩存。首頁的數據離線化,優先展示本地緩存數據,等待網絡數據返回之後更新緩存並展示;
  6. 懶加載,使用時再去創建;
  7. 網絡優化,減少接口請求,接口合併,使用ip直連,除去DNS解析耗時,使用protobuf協議,使用http2協議。

4 內存優化

1.關於UITableView
(1)善於使用UITableViewCell的重用機制
(2)優化UITableViewCell高度計算

2 懶加載(延遲加載)
3  關於圖片的處理
(1)緩存圖片  一個是用imageNamed,二是用imageWithContentsOfFile。

(2)調整圖片大小
(3)代碼渲染 or 直接獲取
          圖片的解碼字節對齊。
 (4)圖片尺寸的大小 和 imageView 的大小不一致 也會消耗性能,用ImageIO 進行優化
4 數據處理

      在項目開發中,我們會使用到各種格式的數據,例如 JSON、XML 等。還有各種各樣的數據結構,例如數組、鏈表、字典、集合等。使用正確的數據格式和使用正確的數據結構,會減少我們的資源消耗。

(1)選擇正確的數據格式
App與網絡進行交互時,常常採用 JSON 或者 XML 類型的數據格式。

(2)選擇正確的數據結構

不同的數據結構,處理數據的速度是不同的。
數組 NSArray NSMutableArray:有序的一組值。使用索引來查詢很快,使用值查找很慢, 插入/刪除很慢。
字典 NSDictionary NSMutableDictionary:存儲鍵值對。用鍵來查找比較快。
集合 NSSet NSMutableSet:無序的一組值。用值來查找很快,插入/刪除很快。

5 View的處理
(1)避免使用過於複雜的xib 
(2)正確設置View的背景
(3)設定Shadow Path

      如果用下面代碼給 view.layer 添加一個shadow:

      這會使Core Animation 不得不在後臺得出圖形並加好陰影之後再去渲染,這會開銷很大。
如果使用shadowPath則會避免這種問題:

6 合理使用Autorelease Pool

7 正確處理緩存
8  iOS使用的是低內存處理機制Jetsam,這是一個基於優先級隊列的機制。

9 CAShapeLayer是一個通過矢量圖形而不是bitmap來繪製的圖層子類。用CGPath來定義想要繪製的圖形,CAShapeLayer會自動渲染。它可以完美替代我們的直接使用Core Graphics繪製layer,對比之下使用CAShapeLayer有以下優點:

渲染快速。CAShapeLayer 使用了硬件加速,繪製同一圖形會比用 Core Graphics 快很多。
高效使用內存。一個 CAShapeLayer 不需要像普通 CALayer 一樣創建一個寄宿圖形,所以無論有多大,都不會佔用太多的內存。
不會被圖層邊界剪裁掉。
不會出現像素化。

10 畫布ImageContext   消耗內存大    通過 @autoreleasepool 來解決 
11  光柵化,是把GPU的操作轉到CPU上了,生成位圖緩存 。當 shouldRasterize 設成 true 時,layer 被渲染成一個 bitmap,並緩存起來,等下次使用時不會再重新去渲染了。實現圓角本身就是在做顏色混合(blending),如果每次頁面出來時都blending,消耗太大,這時shouldRasterize = yes,下次就只是簡單的從渲染引擎的 cache 裏讀取那張 bitmap,節約系統資源。
   可見,如果要節約內存,儘量少用光柵化。

12 臨時變量過多,建議使用autoreleasepool 以便及時釋放;

https://www.jianshu.com/p/5e95e70948f7   

https://www.jianshu.com/p/1f6bc977d97c
https://mp.weixin.qq.com/s/q1jufAuZytF3yi6tE2jY0g 先弄清楚這裏的學問,再來談iOS內存管理與優化(二)

3 iOS 修改圖片尺寸的方法

https://www.jianshu.com/p/ba45f5539e4e  

1. 畫布ImageContext   消耗內存大    通過 @autoreleasepool 來解決 

2. image I/O 創建省略圖  

https://www.jianshu.com/p/de7b6aede888  iOS的5種圖片縮略技術以及性能探討

 

2 寄宿圖 與 CAShapeLayer 與  drawRect

https://www.jianshu.com/p/bee0d5efc964  drawRect 內存暴增原因,如何優化繪圖

 內存惡鬼drawRect - 談畫圖功能的內存優化

 

1 解碼方式 

1、CGContextDrawImage方式(CoreGraphics)
它接受一個原始的位圖參數 imageRef ,最終返回一個新的解壓縮後的位圖 newImage ,中間主要經過了以下三個步驟:

使用 CGBitmapContextCreate 函數創建一個位圖上下文;
使用 CGContextDrawImage 函數將原始位圖繪製到上下文中;
使用 CGBitmapContextCreateImage 函數創建一張新的解壓縮後的位圖。

2、CGImageGetDataProvider方式(ImageIO)
  1.CGImageSourceCreateWithData(data) 創建ImageSource。
  2.CGImageSourceCreateImageAtIndex(source) 創建一個未解碼的 CGImage。
   3.CGImageGetDataProvider(image) 獲取這個圖片的數據源。
   4.CGDataProviderCopyData(provider) 從數據源獲取直接解碼的數據。
ImageIO 解碼發生在最後一步,這樣獲得的數據是沒有經過顏色類型轉換的原生數據(比如灰度圖像)。

 
鏈接:https://www.jianshu.com/p/e9843d5b70a2
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章