前言
在OC中,有對(duì)象objc,有類(lèi)Class,有父類(lèi)SuperClass,其實(shí)還有一種元類(lèi)MetaClass。在接下來(lái)的RunLoop,消息轉(zhuǎn)發(fā)機(jī)制的學(xué)習(xí)之前需要知道OC類(lèi)和對(duì)象的底層,所以理解類(lèi), 父類(lèi),元類(lèi)的關(guān)系是基礎(chǔ)
1.1 類(lèi)和對(duì)象的關(guān)系
在 Objective-C 中,類(lèi)是對(duì)象的模板或藍(lán)圖,而對(duì)象則是類(lèi)的實(shí)例。每個(gè)對(duì)象都有一個(gè)類(lèi)作為其類(lèi)型,它描述了對(duì)象可以具有的屬性和行為。類(lèi)定義了一組屬性和方法,它們描述了對(duì)象的狀態(tài)和操作。
例如一個(gè)Person類(lèi)
Person *person = [[Person allco] init];
person就是Person實(shí)例化出來(lái)的一個(gè)對(duì)象
2.1 類(lèi)的結(jié)構(gòu)體
在ARC和MRC或多或少都了解過(guò)類(lèi)的實(shí)現(xiàn).
類(lèi)在OC中其實(shí)是一個(gè)指向objc_class的結(jié)構(gòu)體指針
typedef struct objc_class *Class;
struct objc_class {
Class isa;
Class super_class OBJC2_UNAVAILABLE; // 父類(lèi)
const char *name OBJC2_UNAVAILABLE; // 類(lèi)名
long version OBJC2_UNAVAILABLE; // 類(lèi)的版本信息,默認(rèn)為0
long info OBJC2_UNAVAILABLE; // 類(lèi)信息,供運(yùn)行期使用的一些位標(biāo)識(shí)
long instance_size OBJC2_UNAVAILABLE; // 該類(lèi)的實(shí)例變量大小
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; // 該類(lèi)的成員變量列表
struct objc_method_list **methodLists OBJC2_UNAVAILABLE; // 方法定義的列表
struct objc_cache *cache OBJC2_UNAVAILABLE; // 方法緩存
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; // 協(xié)議鏈表
};
2.2 對(duì)象的結(jié)構(gòu)體
typedef struct objc_object {
Class isa;
} *id;
- isa 指針:這個(gè)指針指向他所屬的類(lèi)。
- 對(duì)象的isa指針指向他的類(lèi)。
每個(gè)對(duì)象都有一個(gè)類(lèi),在Objective-C中,對(duì)象的類(lèi)是isa指針決定的,即 isa 指針指向?qū)ο笏鶎俚念?lèi)。
person的類(lèi)就是Person
2.2.1 元類(lèi)
觀察類(lèi)的結(jié)構(gòu)體
struct objc_class {
Class isa; 。。。。。。。
}
類(lèi)的結(jié)構(gòu)體里面也有isa指針。實(shí)質(zhì)上,OC中一切都是對(duì)象,這個(gè)類(lèi)含有isa指針,所以,類(lèi)也是一種對(duì)象。
那么類(lèi)的isa指針指向哪里呢?類(lèi)的isa指針指向該類(lèi)的元類(lèi)(MetaClass)。所以,元類(lèi)就是類(lèi)所屬的類(lèi)。
2.2.2 涉及消息轉(zhuǎn)發(fā)機(jī)制
當(dāng)你給對(duì)象發(fā)送消息時(shí),消息是在尋找這個(gè)對(duì)象的類(lèi)的方法列表。
當(dāng)你給類(lèi)發(fā)消息時(shí),消息是在尋找這個(gè)類(lèi)的元類(lèi)的方法列表。
其原理就是 OC對(duì)象在發(fā)送消息時(shí),運(yùn)行時(shí)庫(kù)會(huì)追尋著對(duì)象的isa
指針得到對(duì)象所屬的類(lèi)。這個(gè)類(lèi)包含了能應(yīng)用于這個(gè)類(lèi)的所有實(shí)例方法以及指向父類(lèi)的指針,以便可以找到父類(lèi)的實(shí)例方法。運(yùn)行時(shí)庫(kù)檢查這個(gè)類(lèi)和其父類(lèi)的方法列表,找到與消息對(duì)應(yīng)的方法。 編譯器會(huì)將消息轉(zhuǎn)換為消息函數(shù)objc_msgSend
進(jìn)行調(diào)用
后續(xù)會(huì)多次出現(xiàn)圖 Instance實(shí)例 metaClass元類(lèi)
2.2.3 元類(lèi)也有類(lèi)
既然元類(lèi)是個(gè)類(lèi),和之前的類(lèi)一樣也是一個(gè)對(duì)象,那元類(lèi)的類(lèi)是什么呢?
所有的元類(lèi)都使用根元類(lèi)作為他們的類(lèi)。這就意味著所有NSObject的子類(lèi)(大多數(shù)類(lèi))的元類(lèi)都會(huì)以NSObject的元類(lèi)作為他們的類(lèi),根元類(lèi)的 isa 指針指向了它自己。
2.3.4 對(duì)象和Class的 isa指針
isa指針在對(duì)象里面表示某個(gè)對(duì)象是一個(gè)什么類(lèi),person對(duì)象就是一個(gè)Person類(lèi)。
對(duì)于 struct objc_class *
類(lèi)型的Class
類(lèi)也有isa指針,也就是類(lèi)本身也是一個(gè)對(duì)象,在類(lèi)對(duì)象的isa的指向的類(lèi)叫元類(lèi),類(lèi)方法就定義在元類(lèi)的接口部分。一個(gè)類(lèi)可以有很多的實(shí)例,這些實(shí)例都指向了一個(gè)相同的對(duì)象。
Person可以有Student,Father,person等等等實(shí)例,這些實(shí)例都有isa指針指向Person,而Person的isa指針也有著唯一的元類(lèi)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-437641.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-437641.html
到了這里,關(guān)于【iOS開(kāi)發(fā)】理解OC的類(lèi),父類(lèi),元類(lèi)的關(guān)系的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!