自動釋放池原理
Autorelease pool自動釋放池怀薛,是OC的一種內(nèi)存自動回收機制刺彩,可以將放入的臨時變量統(tǒng)一回收釋放。自動釋放池銷毀的時枝恋,池內(nèi)所有的對象都會做一次release操作创倔。
任何OC對象只要調(diào)用autorelease方法,就會把該對象放到離自己最近的自動釋放池中焚碌。
@autoreleasepool
是ARC環(huán)境下的自動釋放池自動釋放池的主要底層數(shù)據(jù)結(jié)構(gòu)是:
__AtAutoreleasePool
析構(gòu)函數(shù)和AutoreleasePoolPage
鏈表畦攘。調(diào)用了autorelease的對象最終由AutoreleasePoolPage對象來管理。每執(zhí)行
@autoreleasepool
底層對應(yīng)執(zhí)行objc_autoreleasePoolPush( )
十电; 就會往AutoreleasePoolPage添加 POOL_BOUNDARY(宏)知押,并返回POOL_BOUNDARY所在AutoreleasePoolPage的內(nèi)存空間地址。@autoreleasepool{}
大括號結(jié)束 內(nèi)部創(chuàng)建的__AtAutoreleasePool
對象銷毀鹃骂,調(diào)用析構(gòu)函數(shù)objc_autoreleasePoolPop(atautoreleasepoolobj)
台盯。AutoreleasePoolPage開始從后往前遍歷autorelease對象調(diào)用release方法直到
objc_autoreleasePoolPop( )
傳入的POOL_BOUNDARY地址為止。
優(yōu)化
內(nèi)存優(yōu)化
核心:減少不必要的內(nèi)存支出
1.避免內(nèi)存泄漏
- block 循環(huán)引用
- NSTimer 未釋放
- 通知未能正確的移除
2.Masonry框架
- 沒有superView畏线,或某個參數(shù)為nil時静盅,容易導(dǎo)致崩潰
- 盡量少用
3.數(shù)據(jù)模型中冗余的字段
4.無用的圖片資源,常駐內(nèi)存不必要的圖片
5.使用了不合理的API
- 對于僅使用一次或是使用頻率很低的大圖片資源寝殴,使用了
[UIImage imageNamed:]
方法進行加載 - 一些圖片本身非常適合用9片圖的機制進行拉伸蒿叠,但沒有進行相應(yīng)的優(yōu)化
- 在自定義的UIView子類中明垢,利用drawRect:方法進行繪制,通過CAShapeLayer有硬件加速的繪圖API替代
6.網(wǎng)絡(luò)圖片很大
注意關(guān)閉第三方庫的緩存機制市咽,例如SDwebImage
7.產(chǎn)品打包關(guān)閉NSlog
耗電優(yōu)化
核心:減少CPU袖外、GPU功耗
1.少用定時器
2.優(yōu)化IO操作
不要頻繁寫入小數(shù)據(jù),讀取大文件用異步讀然晡瘛(dispatch_io)曼验,數(shù)據(jù)較大時使用數(shù)據(jù)庫**
3.定位
盡量用低精度的,盡量不要用實時更新定位粘姜,定位完畢就關(guān)掉服務(wù)
4.硬件檢測
加速度計鬓照、陀螺儀、磁力計等硬件檢測在不需要時候關(guān)閉
5.網(wǎng)絡(luò)請求
減少請求次數(shù)孤紧,
壓縮網(wǎng)絡(luò)數(shù)據(jù)豺裆,
如果請求數(shù)據(jù)相同,盡量用緩存号显,
使用斷點續(xù)傳臭猜,
網(wǎng)絡(luò)不可用時,不要嘗試執(zhí)行網(wǎng)絡(luò)請求押蚤。
APP啟動優(yōu)化
核心:減少加載項蔑歌,分散加載壓力
1.第三方類庫不要超過6個
2.使用懶加載
3.用initialize而不用load方法
4.在第一個頁面的ViewDidLoad和ViewWillAppear里少做事件
5.二進制重排
DYLD_PRINT_STATISTICS 設(shè)置為1
頁面優(yōu)化
核心:減少CPU GPU資源消耗,保證60FPS速度
1.使用輕量級對象揽碘,例如CALayer代替View
2.不要頻繁改編UIView的 frame bounds等屬性次屠,提前布置好布局,減少修改
3.AutoLayOut雳刺、Xib少用
4.圖片的size和UIImageView的size保持一致
5.避免離屏渲染劫灶,最大圖片不要超過4096x4096,減少圖層掖桦,關(guān)掉alpha本昏,mask&ClipToBounds
6.控制線程數(shù)量,耗時操作放入子線程