在Objective-C 中茅姜,對象調(diào)用方法,這是很常見的事情月匣。也許是燈下黑,就因?yàn)樗艹R姺茏耍晕乙郧岸紱]有深入地去了解過锄开,它的實(shí)現(xiàn)機(jī)制是怎樣的。這次称诗,趁著空閑萍悴,多方查閱資料,總算了解了大概。
當(dāng)對象收到消息時(shí)癣诱,消息函數(shù)首先根據(jù)該對象的isa指針找到該對象所對應(yīng)的類的方法表计维,并從表中尋找該消息對應(yīng)的方法selector。如果找不到撕予,objc_msgSend將繼續(xù)從父類中尋找鲫惶,直到NSObject類。一旦找到了方法選標(biāo)实抡, objc_msgSend則以消息接收者對象為參數(shù)調(diào)用欠母,調(diào)用該選標(biāo)對應(yīng)的方法實(shí)現(xiàn)。調(diào)用方式:objc_msgSend(receiver, selector, arg1, arg2, ...)
這就是在運(yùn)行時(shí)系統(tǒng)中選擇方法實(shí)現(xiàn)的方式吆寨。在面向?qū)ο缶幊讨猩吞剩话惴Q作方法和消息動(dòng)態(tài)綁定的過程。
什么是objc_msgSend啄清、isa 六水?我們得先了解一下運(yùn)行時(shí)、類和對象的相關(guān)知識(shí)辣卒。我們都知道掷贾,對象是類的一個(gè)實(shí)例,但其實(shí)添寺,類也是一個(gè)對象胯盯。既然對象能調(diào)用實(shí)例方法,而類又能調(diào)用類方法计露,那么把類也當(dāng)成是一種特殊的對象博脑,是件順理成章的事情。對象是類的一個(gè)實(shí)例票罐,那么叉趣,如果類也是對象的話,類又是誰的實(shí)例呢该押?問的好疗杉!類,是元類的一個(gè)實(shí)例蚕礼。
網(wǎng)上有很多優(yōu)秀的文章烟具,就不再重復(fù)造輪子了。
可參考:類的本質(zhì)-類對象