一、OC對象的類型有3種:
instance對象(實列對象)、
class對象(類對象)、
meta-class對象(元類對象)
二、instance對象(實列對象)
instance對象就是通過類alloc出來的對象,每次調用alloc都會產生新的instance對象;
創建出來的對象,在內存中存儲的信息包含:成員變量、有一個共同的isa指針成員變量,它指向了該對象的首地址;
三、class對象(類對象)
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];
獲取類對象
? ? ? ? Class objectClass1 = [object1 class];
? ? ? ? Class objectClass2 = [object2 class];
? ? ? ? Class objectClass3 = object_getClass(object1);
? ? ? ? Class objectClass4 = object_getClass(object2);
? ? ? ? Class objectClass5 = [NSObject class];
它們獲取的結果都是同一個對象。每個類在內存中有且只有一個class對象;
class對象在內存中存儲的信息主要包括:
isa指針
supperclass指針
類的屬性信息(@property)
類的對象方法信息(instance method)
類的協議信息(protocol)
類的成員變量信息(ivar),就是成員變量的描述信息,類型和名字等;
四、meta-class對象(元類對象)
獲取元類對象
// class對象,類對象
//class方法返回的一直是class對象,類對象,不管你調用多少次class方法
? ? ? ? Class objectClass1 = [object1 class];
? ? ? ? Class objectClass2 = [object2 class];
? ? ? ? Class objectClass3 = object_getClass(object1);? // Runtime API
? ? ? ? Class objectClass4 = object_getClass(object2);? // Runtime API
? ? ? ? Class objectClass5 = [NSObject class];
// meta-class對象,元類對象
//將類對象當做參數傳入,獲得元類對象
Class objectMetaClass = object_getClass(objectClass5); // Runtime API
Class objectMetaClass2 = [[[NSObjectclass]class]class];
它存儲著類方法;
它是一種特殊的Class對象,結構和類對象一樣,但它內部的值,有些是null;
用object_getClass(類對象),獲取元類對象
用class_isMetaClass(類對象),判斷是否是元類對象,返回值為BOOL
五、object_getClass用內部實現
1.Classobjc_getClass(const char *aClassName)
?1> 傳入字符串類名
?2> 返回對應的類對象
2.Classobject_getClass(id obj)
?1> 傳入的obj可能是instance對象、class對象、meta-class對象
?2> 返回值
?a) 如果是instance對象,返回class對象
?b) 如果是class對象,返回meta-class對象
?c) 如果是meta-class對象,返回NSObject(基類)的meta-class對象
?3.- (Class)class、+ (Class)class
?1> 返回的就是類對象
// 內部實現
?- (Class) {
?? ? return self->isa;
?}
?+ (Class) {
?? ? return self;
?}
六、isa指針
七、class對象的superclass指針
>>當Student的instance對象要調用Person的對象方法時,會先通過isa找到Student的class,然后通過superclass找到Person的class,最后找到對象方法的實現進行調用
八、meta-class對象的superclass指針
>>當Student的class要調用Person的類方法時,會先通過isa找到Student的meta-class,然后通過superclass找到Person的meta-class,最后找到類方法的實現進行調用
九、isa、superclass總結
如果在基類的meta-class $對象中找不到對應的"+類方法",就會到基類的class對象中查找instance方法來進行調用;