啟動(dòng)性能分析
Mach-o
Mach-o文件的類型:

Mach的結(jié)構(gòu)
1:Header
2:Load Commands
3:data
新建項(xiàng)目,在ViewController里面實(shí)現(xiàn)+load方法,打斷點(diǎn),在main里面打斷點(diǎn)。發(fā)現(xiàn)先走的是+load方法,斷點(diǎn)前有很多棧信息 其中有_dyld_start
分析dyld,dyld是什么?
dyld -> dynamic loader 動(dòng)態(tài)加載器
當(dāng)系統(tǒng)吧dyld加到App進(jìn)程后dyld的操作過程:
dyld -> load dylibs -> rebase -> bind -> Objc -> 其他初始化
優(yōu)化之前要測量一下啟動(dòng)時(shí)間
-
main函數(shù)之前的消耗時(shí)間的測量:添加一個(gè)環(huán)境變量就可以在控制臺(tái)將這個(gè)時(shí)間的數(shù)據(jù)打印出來。
image.png
動(dòng)態(tài)庫對(duì)App啟動(dòng)時(shí)間影響的實(shí)測
http://www.cocoachina.com/ios/20161125/18179.html
-
main函數(shù)之后的測量:
利用CFAbsoluteTimeGetCurrent() 獲取時(shí)間
可以得到main之后的時(shí)間
啟動(dòng)時(shí)間優(yōu)化的方向:
- 耗時(shí)操作要進(jìn)行異步處理
- loading的廣告要做緩存
- 減少root頁面viewdidload和viewwillappear里面的操作
- 未使用的動(dòng)態(tài)庫及時(shí)清理掉
內(nèi)存優(yōu)化
如何檢測內(nèi)存方面的問題?
遇到EXC_BAD_ACCESS崩潰的時(shí)候,一般就是出現(xiàn)野指針的時(shí)候。我們開啟僵尸對(duì)象檢測就可以找到僵尸對(duì)象。
開啟步驟:Product->Scheme->Edit Scheme->Diagnostics->勾選Zombie Objects
開啟之后再運(yùn)行,控制臺(tái)會(huì)給出一些信息。從信息中可以分析出僵尸對(duì)象。

這里說明對(duì)象已經(jīng)被釋放了,還依然被使用。
assign與weak,它們都是弱引用類型,最大的區(qū)別是什么?
weak 聲明的變量對(duì)象釋放后,制動(dòng)賦值為nil
assign聲明的變量對(duì)象釋放后,不會(huì)自動(dòng)賦值為nil,會(huì)造成野指針錯(cuò)誤。
內(nèi)存泄漏的檢測方法
- 靜態(tài)檢測方法
1)手動(dòng)內(nèi)存檢測 shift+command+B
2)自動(dòng)內(nèi)存檢測 buildSetting -> Analyze during Build -> YES - 動(dòng)態(tài)檢測方法
instruments 打開方式 product -> profile - 析構(gòu)方法(打印dealloc,看看是否調(diào)用了)
-
第三方內(nèi)存檢測工具
MLeaksFinder 不需要做任何操作 pod進(jìn)去就可以使用了。原理就是runtime實(shí)現(xiàn)的。
instruments 工作流程



