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ì)積極改正!