任何實(shí)例的isa指針指向其類(lèi)對(duì)象拗胜,類(lèi)對(duì)象的isa指針指向其元類(lèi)對(duì)象蔗候,元類(lèi)對(duì)象的isa指針指向根元類(lèi)對(duì)象,根元類(lèi)對(duì)象的isa指針指向根元類(lèi)對(duì)象自己埂软。(類(lèi)對(duì)象锈遥,元類(lèi)對(duì)象,根元類(lèi)對(duì)象都屬于類(lèi)對(duì)象勘畔,具有superClass指針和isa指針所灸,而實(shí)例對(duì)象只有isa指針。)
實(shí)例對(duì)象沒(méi)有superClass指針炫七,類(lèi)對(duì)象的superClass指針指向父類(lèi)的類(lèi)對(duì)象爬立,元類(lèi)對(duì)象的superClass指針指向父類(lèi)的元類(lèi)對(duì)象(注:父類(lèi)的元類(lèi)對(duì)象不同于根元類(lèi)對(duì)象)。
具體關(guān)系如下圖:
使用如下代碼打印log
Class newClass = objc_allocateClassPair([NSError class], "RuntimeErrorSubclass", 0);
class_addMethod(newClass, @selector(report), (IMP)ReportFunction, "v@:");
objc_registerClassPair(newClass);
id instanceOfNewClass = [[newClass alloc] initWithDomain:@"someDomain" code:0 userInfo:nil];
[instanceOfNewClass performSelector:@selector(report)];
void ReportFunction(id self, SEL _cmd) {
NSLog(@"Class is %@, and super is %@.", [self class], [self superclass]);
NSLog(@"This object is %p.", self);
Class currentClass = [self class];
for (int i = 1; i < 5; i++) {
NSLog(@"Following the isa pointer %d times gives %p", i, currentClass);
currentClass = object_getClass(currentClass);
}
NSLog(@"NSObject's class is %p", [NSObject class]);
NSLog(@"NSObject's meta class is %p", object_getClass([NSObject class]));
NSLog(@"NSObject's rootMeta class is %p", object_getClass(object_getClass([NSObject class])));
}
Log如下:
Class is RuntimeErrorSubclass, and super is NSError.
This object is 0x7fc678e14f10.
Following the isa pointer 1 times gives 0x7fc678e11ed0
Following the isa pointer 2 times gives 0x7fc678e190c0
Following the isa pointer 3 times gives 0x1027ac198
Following the isa pointer 4 times gives 0x1027ac198
NSObject's class is 0x1027ac170
NSObject's meta class is 0x1027ac198
NSObject's rootMeta class is 0x1027ac198
object_getClass(id obj)
此函數(shù)返回對(duì)象obj的類(lèi)(因?yàn)轭?lèi)也是對(duì)象万哪,所以此函數(shù)返回對(duì)象obj的isa指針指向的類(lèi)對(duì)象)侠驯。
可以看到,當(dāng)前實(shí)例對(duì)象的地址是0x7fc678e14f10
奕巍,類(lèi)對(duì)象的地址是0x7fc678e11ed0
吟策,元類(lèi)對(duì)象的地址是0x7fc678e190c0
,根元類(lèi)對(duì)象的地址是0x1027ac198
的止。
NSObject的類(lèi)對(duì)象的地址是0x1027ac170
踊挠,元類(lèi)對(duì)象的地址是0x1027ac198
,根元類(lèi)對(duì)象的地址是0x1027ac198
冲杀。