runtime 基礎(chǔ)(一)

runtime是什么?

oc是動(dòng)態(tài)語(yǔ)言,oc代碼在運(yùn)行時(shí)會(huì)轉(zhuǎn)換成c語(yǔ)言代碼。

你會(huì)問(wèn)有什么用?
做業(yè)務(wù)來(lái)說(shuō)用處不大。開(kāi)發(fā)sdk,熱修復(fù)等等用處大大的。

那為什么要了解runtime?
了解runtime你會(huì)對(duì)oc的運(yùn)行機(jī)制理解更深刻,本身學(xué)程序就是學(xué)一種思想。
將實(shí)際問(wèn)題以編程的思維來(lái)解決,也就是智能。

oc對(duì)象

每個(gè)Objective-C對(duì)象都有一個(gè)隱藏的數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)是Objective-C對(duì)象的第一個(gè)成員變量,它就是isa指針。

看看oc對(duì)象的定義

@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}
//一個(gè)isa指針

看看Class

typedef struct objc_class *Class;//結(jié)構(gòu)體
//結(jié)構(gòu)體展開(kāi),注意下面的英文
struct objc_class {
//指向類(lèi)對(duì)象的指針,類(lèi)對(duì)象也是一個(gè)這樣的結(jié)構(gòu)體
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class;    //父類(lèi)                                   
    const char *name;                                         
    long version;                                             
    long info;                                                
    long instance_size;                                       
    struct objc_ivar_list *ivars;                             
    struct objc_method_list **methodLists;   //方法數(shù)組                 
    struct objc_cache *cache; //緩存方法                                
    struct objc_protocol_list *protocols;                     
#endif

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

oc有幾種對(duì)象

一種是實(shí)例對(duì)象
一種是類(lèi)對(duì)象

舉例:
現(xiàn)在我有兩個(gè)類(lèi),ClassA是父類(lèi),ClassB類(lèi)是子類(lèi).
ClassA 兩個(gè)方法: - methodA | +methodA
ClassB 兩個(gè)方法: - methodB | +methodB
實(shí)例
a = [ClassA new];
b = [ClassB new];

實(shí)例調(diào)用

[b  methodB]  
---b指向ClassB->isa,isa去結(jié)構(gòu)體遍歷methodLists找到methodB方法;

[b methodA]
---因?yàn)镃lassB 沒(méi)有對(duì)應(yīng)的方法,然后通過(guò)isa的super_class去遍歷父類(lèi)的methodLists,找到了methodA.

類(lèi)調(diào)用

[ClassB  methodB]  
---ClassB的isa,isa中還有一個(gè)Class isa參數(shù),這個(gè)isa指向的是一個(gè)類(lèi)對(duì)象

[ClassB methodA]
---因?yàn)镃lassB 沒(méi)有對(duì)應(yīng)的方法,然后通過(guò)isa的super_class去遍歷父類(lèi)的methodLists,找到了methodA.

盜圖


434405-20151227181339499-1243485875.png

如果我寫(xiě)的有問(wèn)題,請(qǐng)告訴我,我會(huì)積極改正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容