? ? ? ?當我初始接觸到OC的時候愕够,只不過覺得OC中的對象不過是一個結構體过咬,里面存放著結構體變量和相關的函數(shù)指針浦箱。這的確挺符合面向對象設計思想吸耿,但是隨著加深對Runtime的理解,便發(fā)現(xiàn)不是那么簡單酷窥。
? ? ? ? 事實上OC中的對象比我想象中的更簡單咽安。因為它里面僅僅只有一個isa指針。證據(jù)如下:
展現(xiàn)在我們面前的確實很我想象的不一樣蓬推,沒有結構體變量和函數(shù)指針妆棒。這個isa指針實際上是指向這個對象所屬的類,而這個類叫做類對象沸伏。比如說在 id obj = [NSObject new];中糕珊,obj是實例對象,那么NSObject就是obj的類對象毅糟。當我們向一個對象發(fā)送一個消息時红选,會找到這個對象所屬的類,然后把消息交給這個類對象處理姆另。那我們接下來看看類對象的定義:
留意到圖片中的最后一行喇肋,可以得知類對象也是一個對象。那么向類對象發(fā)送一個消息時蜕青,它的isa指針會指向什么苟蹈?比如說:[NSArray arrayWithObjects:XXX];向NSArray這個類對象發(fā)送消息時,沿著isa指針找到的是NSArray的元類右核。那元類也是一個類慧脱,它的isa指針又是指向什么?如果我們此時再引入一種新的類贺喝,那么這種新的類的isa指針又要指向另一種新的類菱鸥,這會導致無限循環(huán)下去。因此躏鱼,需要引入根元類的這個概念氮采,使得所有元類的isa指針都指向它,而根元類的isa指針就指向自身染苛。這樣就形成了一個消息閉環(huán)鹊漠。說再來也比不上來一張圖實際:
圖中還有superClass指針的關系主到,可以看到元類的superClass指針不像isa指針那樣直接指向根元類,而根元類的superClass指針則是指向NSObject躯概。但是這幅圖只是針對NSObject的繼承體系登钥。
objc_class對象中還有很多變量,本文只要搞清楚類和對象的關系娶靡,其他的以后再解釋牧牢。