oc運(yùn)行機(jī)制是動(dòng)態(tài)的,運(yùn)行時(shí)所執(zhí)行的代碼是由運(yùn)行環(huán)境來(lái)決定的,靜態(tài)的機(jī)制是由編譯器來(lái)決定的,(編譯期是指把你的源程序交給編譯器編譯的過(guò)程,最終目的是得到可執(zhí)行的文件。運(yùn)行期指的是你將可執(zhí)行文件交給操作系統(tǒng)(輸入文件名,回車)執(zhí)行、直到程序執(zhí)行結(jié)束的期間,執(zhí)行的目的是為了實(shí)現(xiàn)程序的功能。)
oc是動(dòng)態(tài)綁定,調(diào)用編譯階段并不會(huì)去綁定執(zhí)行的函數(shù),只有在運(yùn)行的時(shí)候才回去對(duì)象中查找方法,接受方法的類中有個(gè)方法列表,如果能找到方法就調(diào)用,找不到的話就回去父類中查找
C語(yǔ)言是靜態(tài)綁定,在編譯的階段就能決定所要調(diào)用的函數(shù)
消息轉(zhuǎn)發(fā)機(jī)制
當(dāng)一個(gè)對(duì)象無(wú)法處理時(shí)間的時(shí)候會(huì)進(jìn)入消息轉(zhuǎn)發(fā)流程,可以通過(guò)運(yùn)行時(shí)機(jī)制,將我們需要的某個(gè)方法加入到類中,這就是運(yùn)行時(shí)添加屬性的原理
分類不能直接添加屬性是因?yàn)榉诸愔袥](méi)有實(shí)現(xiàn)set和get方法,即使手寫(xiě)實(shí)現(xiàn)也不能調(diào)用,如果加入屬性就會(huì)崩潰,因?yàn)檎{(diào)用的時(shí)候找不到set和get方法,這樣會(huì)進(jìn)入消息轉(zhuǎn)發(fā)機(jī)制,此時(shí)就可以利用運(yùn)行時(shí)機(jī)制,當(dāng)進(jìn)入消息轉(zhuǎn)發(fā)機(jī)制后,利用運(yùn)行時(shí)機(jī)制為其生成set和get方法,進(jìn)而添加屬性.