6 id 與 NSObject, instancetype
https://www.jianshu.com/p/a1f377dfc85a
https://www.jianshu.com/p/3b7efa02bdf4
5 啓動優化總結
關於app啓動優化,可以從幾方面入手:
- 減少不必要的framework;
- 清理項目中沒有使用到的代碼、類,避免冗餘代碼;
- 慎用+load,第三方庫已經使用了夠多的+load方法(objection,rn…),在寫代碼時儘量用+initialize代替+load;
- 梳理流程,優化代碼,啓動模塊化。耗時操作不要在主線程;
- 本地緩存。首頁的數據離線化,優先展示本地緩存數據,等待網絡數據返回之後更新緩存並展示;
- 懶加載,使用時再去創建;
- 網絡優化,減少接口請求,接口合併,使用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 內存暴增原因,如何優化繪圖
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