一 runtime簡(jiǎn)介
1.runtime簡(jiǎn)稱運(yùn)行時(shí) OC就是運(yùn)行時(shí)機(jī)制嫡锌,也就是在運(yùn)行時(shí)的一些機(jī)制,其中最主要的是消息機(jī)制势木。
2.相比C語(yǔ)言 函數(shù)的調(diào)用時(shí)在編譯的時(shí)候會(huì)決定調(diào)用哪個(gè)函數(shù)
3. 對(duì)于OC的函數(shù)屬于動(dòng)態(tài)的調(diào)用啦桌,在編譯的時(shí)候并不能決定真正調(diào)用哪個(gè)函數(shù),只有在真正運(yùn)行的還是才會(huì)根據(jù)函數(shù)的名字來(lái)找到對(duì)于的函數(shù)并且調(diào)用
二 runtime的作用
1 發(fā)送消息
方法調(diào)用的本質(zhì)就是讓對(duì)象發(fā)送消息
objc_msgSend 只有對(duì)象才能發(fā)送消息 所以以 objc開(kāi)頭
使用消息機(jī)制的前提 是要導(dǎo)入 #Import <objc/message>
可以使用 命令 ?clang -rewrite - objc main.m 查看最終生成的代碼
下面舉例說(shuō)明
Dog *dog = [[Dog alloc] init];
//調(diào)用對(duì)象方法
[dog run];
本質(zhì)就是 objc_msgSend(dog,@selector(run)) (如果報(bào)錯(cuò) 可以在 building seting 輸入 msg ?會(huì)出來(lái) enable strict開(kāi)頭的 設(shè)置為NO就行)
//調(diào)用類(lèi)方法
[Dog run] ?或者 [[Dog class] run];
本質(zhì)是調(diào)用了 objc_msgSend([Dog class],@selector(run))
二 交換方法
開(kāi)發(fā)中使用的場(chǎng)景:系統(tǒng)自帶的方法功能不夠 給系統(tǒng)自帶的方法擴(kuò)展一些功能且改,并且仍能保持原有的功能
方法1 繼承系統(tǒng)的類(lèi) 重寫(xiě)方法
方法2 使用runtime交換方法