OC對(duì)象的分類
OC對(duì)象主要分為三類:instance(實(shí)例對(duì)象)舷夺,class (類對(duì)象)苦酱,meta-class(元類對(duì)象)
-
實(shí)例對(duì)象:
實(shí)例對(duì)象就是通過類調(diào)用alloc來(lái)產(chǎn)生的instance,每一次調(diào)用的alloc都是產(chǎn)生新的實(shí)例對(duì)象给猾,內(nèi)存地址都是不一樣的疫萤,占據(jù)著不同的內(nèi)存 eg:
NSObject *objc1 = [[NSObject alloc]init];
NSObject *objc2 = [[NSObject alloc]init];
NSLog(@"instance----%p %p",objc1,objc2);
輸出結(jié)果:-
instance實(shí)例對(duì)象存儲(chǔ)的信息:
2.其他成員變量
1.isa指針
我們平時(shí)說打印出來(lái)的實(shí)例對(duì)象的地址開始就是指的是isa的地址,即isa的地址排在最前面耙册,就是我們實(shí)例對(duì)象的地址 -
類對(duì)象
- 類對(duì)象的獲取
Class Classobjc1 = [objc1 class];
Class Classobjc2 = [objc2 class];
Class Classobjc3 = object_getClass(objc1);
Class Classobjc4 = object_getClass(objc2);
Class Classobjc5 = [NSObject class];
NSLog(@"class---%p %p %p %p %p ",Classobjc1,Classobjc2,Classobjc3,Classobjc4,Classobjc5);
打印結(jié)果
2020-09-22 15:48:00.125034+0800 OC底層[1095:69869] class---0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140
從打印的結(jié)果我們可以看到给僵,所有指針指向的類對(duì)象的地址是一樣的,也就是說一個(gè)類的類對(duì)象只有唯一的一個(gè)
-
類對(duì)象的作用
類對(duì)象存儲(chǔ)的信息:
1.isa指針
2.superclass指針
3.類的方法(method详拙,即減號(hào)方法)帝际,類的屬性(@property),協(xié)議信息饶辙,成員變量信息(這里的成員變量不是指的值蹲诀,因?yàn)槊總€(gè)對(duì)象的值是由每個(gè)實(shí)例對(duì)象所決定的,這里指的是成員變量的類型弃揽,比如整形脯爪,字典,字符串矿微,以及成員變量的名字)
-
元類對(duì)象
1.元類對(duì)象的獲取
Class metaObjc1 = object_getClass([NSObject class]);
Class metaObjc2 = object_getClass(Classobjc1);
Class metaObjc3 = object_getClass(Classobjc3);
Class metaObjc4 = object_getClass(Classobjc5);
打印指針地址
NSLog(@"meta---%p %p %p %p",metaObjc1,metaObjc2,metaObjc3,metaObjc4);
2020-09-22 16:12:10.191008+0800 OC底層[1131:77555] instance----0x60000000c2e0 0x60000000c2f0
2020-09-22 16:12:10.191453+0800 OC底層[1131:77555] class---0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140
2020-09-22 16:12:10.191506+0800 OC底層[1131:77555] meta---0x7fff9381e0f0 0x7fff9381e0f0 0x7fff9381e0f0 0x7fff9381e0f0
獲取元類對(duì)象的方法就是利用runtime方法痕慢,傳入類對(duì)象,就可以獲取該類的元類對(duì)象涌矢,從打印的結(jié)果可以看出掖举,所有的指針地址一樣,也就是說一個(gè)類的元類只有唯一的一個(gè)
特別注意一點(diǎn):
Class objc = [[NSObject class] class];
Class objcL = [[[NSObject class] class] class];
無(wú)論class幾次娜庇,它返回的始終是類對(duì)象
2020-09-22 16:21:11.065008+0800 OC底層[1163:81105] objcClass---0x7fff9381e140--0x7fff9381e140
元類存儲(chǔ)結(jié)構(gòu):
元類的存儲(chǔ)結(jié)構(gòu)和類存儲(chǔ)結(jié)構(gòu)是一樣的塔次,但是存儲(chǔ)的信息和用途不一樣方篮,元類的存儲(chǔ)信息主要包括:
1.isa指針
2.superclass指針
3.類方法(即加號(hào)方法)
從圖中我們可以看出元類的存儲(chǔ)結(jié)構(gòu)和類存儲(chǔ)結(jié)構(gòu)一樣,只是有一些值為空
- 判斷是否為元類
class_isMetaClass(objcL);