【发布时间】:2013-03-09 10:07:59
【问题描述】:
这是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 指针访问超类?但它究竟是如何发生的?这个怎么运作?谁能解释一下?
【问题讨论】:
-
你在哪里找到这个定义?这个头文件显示了一个不同的:opensource.apple.com/source/objc4/objc4-208/runtime/…
-
我在 objc/runtime.h 中找到了它
-
这取决于我认为的运行时版本
-
你是对的;我在看一个旧版本。
-
@trojanfoe 这个是新的opensource.apple.com/source/objc4/objc4-532/runtime/runtime.h
标签: objective-c objective-c-runtime