復(fù)習(xí)總結(jié)3 自動(dòng)釋放池 & 優(yōu)化

自動(dòng)釋放池原理

  • Autorelease pool自動(dòng)釋放池,是OC的一種內(nèi)存自動(dòng)回收機(jī)制,可以將放入的臨時(shí)變量統(tǒng)一回收釋放。自動(dòng)釋放池銷毀的時(shí),池內(nèi)所有的對(duì)象都會(huì)做一次release操作。

  • 任何OC對(duì)象只要調(diào)用autorelease方法,就會(huì)把該對(duì)象放到離自己最近的自動(dòng)釋放池中。@autoreleasepool是ARC環(huán)境下的自動(dòng)釋放池

  • 自動(dòng)釋放池的主要底層數(shù)據(jù)結(jié)構(gòu)是:__AtAutoreleasePool析構(gòu)函數(shù)和 AutoreleasePoolPage鏈表。調(diào)用了autorelease的對(duì)象最終由AutoreleasePoolPage對(duì)象來管理。

  • 每執(zhí)行@autoreleasepool底層對(duì)應(yīng)執(zhí)行objc_autoreleasePoolPush( ); 就會(huì)往AutoreleasePoolPage添加 POOL_BOUNDARY(宏),并返回POOL_BOUNDARY所在AutoreleasePoolPage的內(nèi)存空間地址。

  • @autoreleasepool{}大括號(hào)結(jié)束 內(nèi)部創(chuàng)建的__AtAutoreleasePool對(duì)象銷毀,調(diào)用析構(gòu)函數(shù)objc_autoreleasePoolPop(atautoreleasepoolobj)。

  • AutoreleasePoolPage開始從后往前遍歷autorelease對(duì)象調(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,或某個(gè)參數(shù)為nil時(shí),容易導(dǎo)致崩潰
  • 盡量少用

3.數(shù)據(jù)模型中冗余的字段

4.無用的圖片資源,常駐內(nèi)存不必要的圖片

5.使用了不合理的API

  • 對(duì)于僅使用一次或是使用頻率很低的大圖片資源,使用了[UIImage imageNamed:]方法進(jìn)行加載
  • 一些圖片本身非常適合用9片圖的機(jī)制進(jìn)行拉伸,但沒有進(jìn)行相應(yīng)的優(yōu)化
  • 在自定義的UIView子類中,利用drawRect:方法進(jìn)行繪制,通過CAShapeLayer有硬件加速的繪圖API替代

6.網(wǎng)絡(luò)圖片很大
注意關(guān)閉第三方庫的緩存機(jī)制,例如SDwebImage

7.產(chǎn)品打包關(guān)閉NSlog

耗電優(yōu)化

核心:減少CPU、GPU功耗
1.少用定時(shí)器

2.優(yōu)化IO操作
不要頻繁寫入小數(shù)據(jù),讀取大文件用異步讀?。╠ispatch_io),數(shù)據(jù)較大時(shí)使用數(shù)據(jù)庫**

3.定位
盡量用低精度的,盡量不要用實(shí)時(shí)更新定位,定位完畢就關(guān)掉服務(wù)

4.硬件檢測(cè)
加速度計(jì)、陀螺儀、磁力計(jì)等硬件檢測(cè)在不需要時(shí)候關(guān)閉

5.網(wǎng)絡(luò)請(qǐng)求
減少請(qǐng)求次數(shù),
壓縮網(wǎng)絡(luò)數(shù)據(jù),
如果請(qǐng)求數(shù)據(jù)相同,盡量用緩存,
使用斷點(diǎn)續(xù)傳,
網(wǎng)絡(luò)不可用時(shí),不要嘗試執(zhí)行網(wǎng)絡(luò)請(qǐng)求。

APP啟動(dòng)優(yōu)化

核心:減少加載項(xiàng),分散加載壓力
1.第三方類庫不要超過6個(gè)
2.使用懶加載
3.用initialize而不用load方法
4.在第一個(gè)頁面的ViewDidLoad和ViewWillAppear里少做事件
5.二進(jìn)制重排
DYLD_PRINT_STATISTICS 設(shè)置為1

頁面優(yōu)化

核心:減少CPU GPU資源消耗,保證60FPS速度
1.使用輕量級(jí)對(duì)象,例如CALayer代替View
2.不要頻繁改編UIView的 frame bounds等屬性,提前布置好布局,減少修改
3.AutoLayOut、Xib少用
4.圖片的size和UIImageView的size保持一致
5.避免離屏渲染,最大圖片不要超過4096x4096,減少圖層,關(guān)掉alpha,mask&ClipToBounds
6.控制線程數(shù)量,耗時(shí)操作放入子線程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容