内容简介:一说到类,就免不了说老生常谈的问题,就是 SuperClass 指向问题。 下面通过实例代码来说明问题。代码输出
一说到类,就免不了说老生常谈的问题,就是 SuperClass 指向问题。 下面通过实例代码来说明问题。
代码
Student *st = [Student new];
Class cls = [Student class];
Class cls1 = st.class;
Class cls2 = object_getClass(st);
NSLog(@"%p, %p, %p", cls, cls1, cls2);
Class cls3 = object_getClass(cls2);
class_isMetaClass(cls3) ? NSLog(@"Meta class") : NSLog(@"Not meta");
Class cls4 = class_getSuperclass(cls3);
NSLog(@"cls4 %@", [NSString stringWithUTF8String:class_getName(cls4)]);
Class cls5 = class_getSuperclass(cls4);
NSLog(@"cls5 %@", [NSString stringWithUTF8String:class_getName(cls5)]);
Class cls6 = class_getSuperclass(cls5);
NSLog(@"cls6 %@", [NSString stringWithUTF8String:class_getName(cls6)]);
NSLog(@"%p, %p, %p", cls4, cls5, cls6);
复制代码
输出
0x100001260, 0x100001260, 0x100001260 Meta class cls4 NSObject cls5 NSObject cls6 nil 0x100afd0f0, 0x100afd140, 0x0 复制代码
如果代码看着蓝瘦,可以看看截图 :grinning:。
那么首先说明了两个问题:
- 类对象只有一个 (他们内存地址都一馍馍一样样)
- 其次也说明了
Super指向问题。Instance class -> Class -> Meta Class -> Meta Class Root -> Root Class - > nil, 那么也验证经典的走位图.
补充啥是元类: 元类是 类 对象所属的 类 , 其他概念都是一样的,一层层套。
Isa 走位
下面使用控制台来查找 isa 的走位流程。(上图里面也包含了 isa 走位图) 首先我把前面的代码改了一点。上代码
Student *st = [Student new];
Class cls = [Student class];
Class cls1 = st.class;
Class cls2 = object_getClass(st);
NSLog(@"%p, %p, %p", cls, cls1, cls2);
Class cls3 = object_getClass(cls2);
class_isMetaClass(cls3) ? NSLog(@"Meta class") : NSLog(@"Not meta");
Class cls4 = object_getClass(cls3);
NSLog(@"cls4 %@", [NSString stringWithUTF8String:class_getName(cls4)]);
Class cls5 = object_getClass(cls4);
NSLog(@"cls5 %@", [NSString stringWithUTF8String:class_getName(cls5)]);
Class cls6 = object_getClass(cls5);
NSLog(@"cls6 %@", [NSString stringWithUTF8String:class_getName(cls6)]);
Class cls7 = object_getClass(cls5);
NSLog(@"cls7 %@", [NSString stringWithUTF8String:class_getName(cls7)]);
复制代码
这是基础代码,下面一步步来看 isa 流程,但是在开始之前补充一点 isa 相关的东西。有一个 magic number,在 isa 中的展示如下
inline Class
objc_object::ISA()
{
assert(!isTaggedPointer());
#if SUPPORT_INDEXED_ISA
if (isa.nonpointer) {
uintptr_t slot = isa.indexcls;
return classForIndex((unsigned)slot);
}
return (Class)isa.bits;
#else
return (Class)(isa.bits & ISA_MASK);
#endif
}
复制代码
在获得 isa 的时候就会和一个数字做 & 运算。 那么这个数字是 ISA_MASK = 0x00007ffffffffff8 ,其实我们都知道 isa 的走位图,我就不又臭又长的再次说了。 下面开始咯。
其实都在这个图上了。看看应该就明白了。
以上也印证了和上文中 Superclass 的走位图是一样的。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Mechanics of Web Handling
David R. Roisum
This unique book covers many aspects of web handling for manufacturing, converting, and printing. The book is applicable to any web including paper, film, foil, nonwovens, and textiles. The Mech......一起来看看 《The Mechanics of Web Handling》 这本书的介绍吧!