返回

多维解析OC方法本质(上)之isa的奥秘与继承揭秘

IOS

一、isa的奥秘

isa是Objective-C中的一个,用于表示对象的类。每个对象都有一个isa指针,指向该对象的类。isa指针指向的类是对象的元类。元类也是一个类,但它不是普通类,而是普通类的类。

1. isa的走位图

isa指针是一个32位的指针,它的走位图如下:

+--------+--------+--------+--------+
| Class ID | Offset | Method  | Flags  |
+--------+--------+--------+--------+
  • Class ID: 表示类的唯一标识符。
  • Offset: 表示对象在内存中的偏移量。
  • Method: 表示对象的方法列表。
  • Flags: 表示对象的标志位。

2. isa的继承链

每个类都有一个父类,父类的isa指针指向祖父类,以此类推,直到根类。根类的isa指针指向它自己。这样就形成了一个继承链。

+---------+
| NSObject |
+---------+
    ^
    |
+---------+
| Person  |
+---------+
    ^
    |
+---------+
| Student |
+---------+

二、继承揭秘

在Objective-C中,子类可以继承父类的属性和方法。子类的isa指针指向父类的类,父类的isa指针指向祖父类的类,以此类推,直到根类。根类的isa指针指向它自己。

这样就形成了一个继承链。子类可以继承父类的一切,包括属性、方法和实例变量。

1. 方法的继承

子类可以继承父类的方法。子类的方法列表中包含父类的方法列表。子类的方法可以覆盖父类的方法。当子类的方法覆盖父类的方法时,子类的方法会取代父类的方法。

2. 属性的继承

子类可以继承父类的属性。子类的属性列表中包含父类的属性列表。子类的属性可以覆盖父类的属性。当子类的属性覆盖父类的属性时,子类的属性会取代父类的属性。

3. 实例变量的继承

子类可以继承父类的实例变量。子类的实例变量列表中包含父类的实例变量列表。子类的实例变量可以覆盖父类的实例变量。当子类的实例变量覆盖父类的实例变量时,子类的实例变量会取代父类的实例变量。

三、LLDB分析类的结构

LLDB是一个强大的调试工具,可以用来分析类的结构。可以使用LLDB命令po来打印对象的isa指针。可以使用LLDB命令image list来打印类的结构。

(lldb) po [person isa]
0x100000778
(lldb) image list
...
0x100000778 - 0x100000950 Person

从LLDB的输出可以看出,Person类的isa指针指向0x100000778。Person类的结构如下:

+---------+
| Person  |
+---------+
    ^
    |
+---------+
| NSObject |
+---------+

Person类继承自NSObject类。Person类的isa指针指向NSObject类的类。NSObject类的isa指针指向它自己。

四、内存偏移

内存偏移是对象在内存中的位置。可以使用LLDB命令p来打印对象的内存偏移。

(lldb) p person
0x7ffee276c18d0

从LLDB的输出可以看出,person对象的内存偏移是0x7ffee276c18d0。

五、结语

通过本文的讲解,相信大家对OC方法的本质有了一个更加深入的了解。掌握了这些知识,将有助于我们更好地理解OC语言,编写出更加优质的代码。