OC的動(dòng)態(tài)特性表現(xiàn)為了三個(gè)方面:動(dòng)態(tài)類型脑又、動(dòng)態(tài)綁定暮胧、動(dòng)態(tài)加載。
1.動(dòng)態(tài)類型:
即運(yùn)行時(shí)再?zèng)Q定對(duì)象的類型问麸。簡(jiǎn)單說就是id類型往衷,任何對(duì)象都可以被id指針?biāo)福挥性谶\(yùn)行時(shí) ? ? ? ?才能決定是什么類型严卖。像內(nèi)置的明確的基本類型都屬于靜態(tài)類型(int席舍、NSString等)。靜態(tài)類型在編 譯的時(shí)候就能被識(shí)別出來(lái)哮笆。所以来颤,若程序發(fā)生了類型不對(duì)應(yīng),編譯器就會(huì)發(fā)出警告稠肘。而動(dòng)態(tài)類型就編譯器編譯的時(shí)候是不能被識(shí)別的福铅,要等到運(yùn)行時(shí)(run time),即程序運(yùn)行的時(shí)候才會(huì)根據(jù)語(yǔ)境來(lái)識(shí)別项阴。所以這里面就有兩個(gè)概念要分清:編譯時(shí)跟運(yùn)行時(shí)滑黔。
2.動(dòng)態(tài)綁定:
基于動(dòng)態(tài)類型,在某個(gè)實(shí)例對(duì)象被確定后环揽,其類型便被確定了略荡。該對(duì)象對(duì)應(yīng)的屬性和響應(yīng)的消息也被完全確定,這就是動(dòng)態(tài)綁定歉胶。比如我們一般向一個(gè)NSObject對(duì)象發(fā)送-respondsToSelector:或者 -instancesRespondToSelector:等來(lái)確定對(duì)象是否可以對(duì)某個(gè)SEL做出響應(yīng)汛兜,而在OC消息轉(zhuǎn)發(fā)機(jī)制被觸發(fā)之前,對(duì)應(yīng)的類 的+resolveClassMethod:和+resolveInstanceMethod:將會(huì)被調(diào)用跨扮,在此時(shí)有機(jī)會(huì)動(dòng)態(tài)地向類或者實(shí)例添加新的方 法序无,也即類的實(shí)現(xiàn)是可以動(dòng)態(tài)綁定的;isKindOfClass也是一樣的道理衡创。
3.動(dòng)態(tài)加載:
所謂動(dòng)態(tài)加載就是我們做開發(fā)的時(shí)候icon圖片的時(shí)候在Retina設(shè)備上要多添加一個(gè)張@2x的圖片,當(dāng)設(shè)備更換的時(shí)候,圖片也會(huì)自動(dòng)的替換帝嗡。
簡(jiǎn)單的來(lái)說就是:.object-c類的類型和數(shù)據(jù)變量的類型都是在運(yùn)行是確定的,而不是在編譯時(shí)確定璃氢。例如:多態(tài)特性哟玷,我們可以使用父類對(duì)象來(lái)指向子類對(duì)象,并且可以用來(lái)調(diào)用子類的方法。運(yùn)行時(shí)(runtime)特性,我們可以動(dòng)態(tài)的添加方法巢寡,或者替換方法喉脖。