美文网首页
Objective-C 类结构解析 继承

Objective-C 类结构解析 继承

作者: milawoai | 来源:发表于2020-09-13 20:44 被阅读0次

让我们来看一下这个经典的解析图:

继承与isa

通过内存来解析经典图

首先定义一个OC类Person

@interface Person : NSObject
@end

@implementation Person
@end

 Person *p1 = [Person alloc];

然后让我们通过LLDB命令来查看下它的内存分布:

x/4gx: 以16进制形式打印地址内容,读取4个16字节内容
p/x: 打印变量的十六进制格式信
po: 打印变量的 description 方法

po p1 // p1是Person实例的指针
<Person: 0x1006169d0>

p p1 // 获取p1指向的实例地址
(Person *) $11 = 0x00000001006169d0

x/4g 0x00000001006169d0 // 按16进制打印该地址中的内容
0x1006169d0: 0x001d8001000020e9 0x0000000000000000
0x1006169e0: 0x63756f54534e5b2d 0x6f6c6f4372614268

po 0x001d8001000020e9 & 0x00007ffffffffff8ULL  // 查看Person 实例的 isa
Person

p/x 0x001d8001000020e9 & 0x00007ffffffffff8ULL //获取Person的地址
(unsigned long long) $17 = 0x00000001000020e8

x/4g 0x00000001000020e8 // 按16进制打印Person内容
0x1000020e8: 0x00000001000020c0 0x00007fff9214f118
0x1000020f8: 0x0000000100618310 0x0004801000000007

po 0x00000001000020c0  // 查看Person 类的 isa
Person

p/x 0x00000001000020c0  & 0x00007ffffffffff8ULL //获取Person元类的地址
(unsigned long long) $17 = 0x00000001000020c0


x/4g 0x00000001000020c0 // 按16进制打印Person元类内容
0x1000020c0: 0x00007fff9214f0f0 0x00007fff9214f0f0
0x1000020d0: 0x000000010073ecf0 0x0003e03100000007

po 0x00007fff9214f0f0  // 查看Person元类的 isa
NSObject

p/x 0x00007fff9214f0f0  & 0x00007ffffffffff8ULL  // 获取NSObject的地址
(unsigned long long) $21 = 0x00007fff9214f0f0

x/4g 0x00007fff9214f0f0 // 按16进制打印NSObject的地址
0x7fff9214f0f0: 0x00007fff9214f0f0 0x00007fff9214f118
0x7fff9214f100: 0x000000010073ed70 0x0004e03100000007

我们会发现NSObject的isa还是NSObject
  • person实例对象的 isa 指向了 Person 类
  • Person 类的 isa 指向了 Person 元类
  • Person 元类对象的 isa 指向了 NSObject 类
  • NSObject 类对象的 isa 指向了自己

对实例而言,isa的赋值是在alloc时开始的:

+ (id)self {
    return (id)self;
}
+ (id)alloc {
    return _objc_rootAlloc(self);
}
....
_objc_rootAlloc(Class cls) {
....
obj->initIsa(cls);
....
}

可知对实例Person *p1而言,isa所指向的Class就是静态的Person自身。

Apple自身为了节约性能,并没有在初始化的时候实现所有静态类。
函数static Class realizeClassWithoutSwift(Class cls, Class previously)中,就有为metaClass赋值的操作:

相关文章

网友评论

      本文标题:Objective-C 类结构解析 继承

      本文链接:https://www.haomeiwen.com/subject/jconektx.html