这是摘录自Objective-C runtime programming guide
:
当一个新对象被创建时,它的内存被分配,它的实例变量被初始化。对象变量中的第一个是指向其类结构的指针。这个称为 isa 的指针使对象可以访问其类,并通过该类访问它所继承的所有类。
isa 是NSObject
这样声明的:
Class isa;
反过来Class
,它只不过是一个指向结构的指针
typedef struct objc_class *Class;
现在让我们看看这个结构:
struct objc_class {
Class isa;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
}
我们可以看到,在最新版本的 Objective-C 中,指向超类的指针(以及除另一个 isa 之外的所有其他结构成员)是不可用的。
super_class
所以我的问题是,如果指针不可用,对象如何访问其超类?它是否可以通过另一个 isa 指针访问超类?但它究竟是如何发生的?这个怎么运作?谁能解释一下?