首先看一下類的數(shù)據(jù)結(jié)構(gòu):

Objective-C中的對(duì)象,主要可以分為3種
instance對(duì)象(實(shí)例對(duì)象)
class對(duì)象(類對(duì)象)
meta-class對(duì)象(元類對(duì)象)
// instance對(duì)象,實(shí)例對(duì)象
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];
// class對(duì)象,類對(duì)象
// class方法返回的一直是class對(duì)象,類對(duì)象
Class objectClass1 = [object1 class];
Class objectClass2 = [object2 class];
Class objectClass3 = object_getClass(object1);
Class objectClass4 = object_getClass(object2);
Class objectClass5 = [NSObject class];
// meta-class對(duì)象,元類對(duì)象
//元類對(duì)象只能通過object_getClass獲取,參數(shù)必須是類對(duì)象
Class objectMetaClass = object_getClass(objectClass1);
//獲取到的還是類對(duì)象
// Class objectMetaClass2 = [[[NSObject class] class] class];
NSLog(@"instance - %p %p",
object1,
object2);
NSLog(@"class - %p %p %p %p %p %d",
objectClass1,
objectClass2,
objectClass3,
objectClass4,
objectClass5,
class_isMetaClass(objectClass1));
NSLog(@"objectMetaClass - %p %d", objectMetaClass, class_isMetaClass(objectMetaClass));
結(jié)果如下:
instance - 0x100547320 0x100544c90
class - 0x7fff805fb388 0x7fff805fb388 0x7fff805fb388 0x7fff805fb388 0x7fff805fb388 0
objectMetaClass - 0x7fff805fb360 1
一.實(shí)例對(duì)象
object1、object2為實(shí)例對(duì)象,每個(gè)實(shí)例對(duì)象內(nèi)存地址是不一樣的,內(nèi)部存儲(chǔ)信息主要包括:
1.isa
2.其他成員變量(ivar)
3.其他成員屬性(最終還是成員變量)
二.類對(duì)象
objectClass1 ~ objectClass5都是NSObject的class對(duì)象(類對(duì)象)
它們是同一個(gè)對(duì)象。每個(gè)類在內(nèi)存中有且只有一個(gè)class對(duì)象
class對(duì)象在內(nèi)存中存儲(chǔ)的信息主要包括:
1.isa指針
2.superclass指針
3.類的屬性信息(@property)
4.類的對(duì)象方法信息(instance method)
5.類的協(xié)議信息(protocol)
6.類的成員變量信息(ivar)
7....
三.元類對(duì)象
meta-class對(duì)象,元類對(duì)象
元類對(duì)象只能通過object_getClass獲取,參數(shù)必須為類對(duì)象
Class objectMetaClass = object_getClass(objectClass1);
Class objectMetaClass2 = [[[NSObject class] class] class];獲取的還是類對(duì)象
objectMetaClass是NSObject的meta-class對(duì)象(元類對(duì)象)
每個(gè)類在內(nèi)存中有且只有一個(gè)meta-class對(duì)象
meta-class對(duì)象和class對(duì)象的內(nèi)存結(jié)構(gòu)是一樣的,但是用途不一樣,在內(nèi)存中存儲(chǔ)的信息主要包括
1.isa指針
2.superclass指針
3.類的類方法信息(class method)
4....
方法class_isMetaClass()可以用來判斷是否是元類對(duì)象
1.Class objc_getClass(const char *aClassName)
1> aClassName 類名必須是字符串
2> 返回對(duì)應(yīng)的類對(duì)象
2.Class object_getClass(id obj)
1> 傳入的obj可能是instance對(duì)象、class對(duì)象、meta-class對(duì)象
2> 返回值
a) 如果是instance對(duì)象,返回class對(duì)象
b) 如果是class對(duì)象,返回meta-class對(duì)象
c) 如果是meta-class對(duì)象,返回NSObject(基類)的meta-class對(duì)象
3.- (Class)class、+ (Class)class
1> 返回的就是類對(duì)象
- (Class) {
return self->isa;
}
+ (Class) {
return self;