近四年沒更CSDN了,感慨萬千,
近年來在搞一款比較大的APP,專案中代碼量100w+,里面使用的三方庫、其他領域的二進制包比較多;以前這些三方、二進制都擠在同一個工程目錄下,導致耦合性太大,專案看著特別雜亂臃腫,新人往往無從下手;兩年前某大佬帶隊搞了一波解耦合,拆拆解解,如今的專案還是比較清晰明了的,按照模塊劃分出各種framework進行集成,便于管理,
即使解耦合,專案中的100w+代碼量還是實實在在的,性能優化、記憶體優化、IPA瘦身不得不提,
基本上如果專案運行起來,手機發燙頁面卡頓,不用想,肯定哪里又記憶體泄漏了;如今的手機性能,如果僅僅是開發人員技術問題導致記憶體消耗,那是到不了發燙的程度,從記憶體泄漏方面排查會比較實用,
近年來招聘程序中,性能優化是必考問題,很多面試者都來自于小公司,涉及專案比較小,對于記憶體優化從來沒有關注過,能說上來個一二三的,寥寥無幾,
性能與記憶體相輔相成,相愛相殺,今天我們先說說記憶體優化,關于IPA瘦身,下次再約,
目錄
1、屬性修飾詞
2、UIImage的加載
3、UIImage改變顏色
4、避免縮放圖片
5、drawRect繪制
6、drawInContext
7、控制元件設定背景色
8、按需加載
9、三方的快取處理
1、屬性修飾詞
這個比較基礎了,放在這里說感覺不太合適,但又不得不說,就提一句
atomic:原子屬性,setter方法會加自旋鎖,執行緒安全,避免了執行緒中搶奪資源引起的資料例外問題,但會導致資源消耗增大,降低效率,各位酌情使用
nonatomic:非原子屬性,執行緒不安全,但效率高,開發中使用的也較多
2、UIImage的加載
常見的就是UIImage的使用了,加載圖片一般有兩種方式:
通過名字加載::[UIImage imageNamed:],系統會對其進行快取,并且不會釋放,也無法手動清理; 通過路徑加載:imageWithContentsOfFile或者initWithContentsOfFile,系統不會對其快取,圖片不在使用時,會被釋放,
對于使用頻率低、圖片比較大的資源,建議使用后者,
3、UIImage改變顏色
還有一種情況,是給UIImage改變顏色,例如專案中設定主題顏色,一些小按鈕標志也需要跟隨主題顏色而變化,
如果直接使用Core Graphics API更改UIImage顏色,那么記憶體中會額外生產一個影像,導致記憶體消耗,
建議方案設定其tintColor,圖片使用UIImageRenderingModeAlwaysTemplate的方式加載
view.tintColor = [UIColor redColor];
UIImage *image = [[UIImage imageNamed:imgName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
4、避免縮放圖片
縮放必然需要計算,so~
5、drawRect繪制
創建UIView后,如果使用drawRect對其重新繪制,那么記憶體消耗會超出你的想象,建議使用CAShapeLayer來代替drawRect
CAShapeLayer基本可以完爆drawRect,渲染快,記憶體使用高效,邊緣柔和不會有像素塊,做柱狀圖的首選,`
6、drawInContext
請使用CAShapeLayer
7、控制元件設定背景色
避免使用透明view,不透明時,設定opaque屬性為YES,
控制元件如果有背景色,那么會增大記憶體消耗,
對于有背景色的控制元件,盡量使用UIView+控制元件方式,來達到想要的目的,
先到這里,小可愛不乖了,我去看看
8、按需加載
避免同時加載過多資源,不需要立即顯示的view,可稍后進行顯示,考慮懶加載
9、三方的快取處理
SDWebImage的快取機制,分為Disk和Memory兩層,
Memory這一層使得圖片在被訪問時可以免去檔案IO程序,提高性能,默認情況下,Memory里存盤的是解壓后的影像資料,這個會導致巨大的記憶體開銷,
如果想要優化記憶體占用,可以選擇存盤壓縮的影像資料,在應用啟動的地方加如下代碼
[SDImageCache sharedImageCache].config.shouldDecompressImages = NO;
[SDWebImageDownloader sharedDownloader].shouldDecompressImages = NO;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/305568.html
標籤:其他
