博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
`Isa` 走位 & `SuperClass` 走位流程
阅读量:7175 次
发布时间:2019-06-29

本文共 2505 字,大约阅读时间需要 8 分钟。

这是这个文章的写作流程:

  1. SuperClass 走位流程
  2. Isa 走位

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, 0x100001260Meta classcls4 NSObjectcls5 NSObjectcls6 nil0x100afd0f0, 0x100afd140, 0x0复制代码

如果代码看着蓝瘦,可以看看截图 ?。

那么首先说明了两个问题:

  • 类对象只有一个 (他们内存地址都一馍馍一样样)
  • 其次也说明了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 的走位图是一样的。

转载地址:http://mmpzm.baihongyu.com/

你可能感兴趣的文章
Xamarin iOS教程之编辑界面编写代码
查看>>
Construct Binary Tree from Preorder and Inorder Traversal
查看>>
写得好 git 提交信息
查看>>
Linux下获取线程TID的方法
查看>>
Redis和Memcache的区别分析(转)
查看>>
网络请求 http get post 一
查看>>
《计算机问题求解》总结——2014年CCF计算机课程改革导教班(2014.07.11)
查看>>
Google Chrome Plus——绿色便携多功能谷歌浏览器
查看>>
Instant Run
查看>>
浏览器中 for in 反射 对象成员 的差异
查看>>
关于Linux启动时挂载rootfs的几种方式
查看>>
2018年总结
查看>>
34个漂亮的应用程序后台管理界面
查看>>
java JDK6的可变参数
查看>>
初入职场程序员的五大钻石法则
查看>>
Node.js学习笔记(一)概述
查看>>
split的3种方法
查看>>
忽略PNG透明区域的事件(AS/Flash)
查看>>
文本框只能输入正整数(大于0的整数)代码
查看>>
一步一个脚印学习WCF系列之WCF概要—WCF服务的创建与调用HelloWorld实例,通过配置文件方式(六)...
查看>>