Lui*_*BOL 4 class objective-c objective-c-runtime
在objective-c运行时,类由以下结构表示:
typedef struct class_t {
struct class_t *isa; // Points to the class' meta class
struct class_t *super; // Points to the class' super class
Cache cache;
IMP *vtable;
union {
class_ro_t *rodata;
class_rw_t *rwdata;
};
} class_t;
Run Code Online (Sandbox Code Playgroud)
当一个MyClass类是一个根类而不是一个元类时,它的超级成员是一个NULL指针(这是可以理解的,因为它是一个根类,因此它没有超类).但是,如果我们得到同MyClass一根类的isa成员(指向MyClass'meta class),并且我们得到该isa成员的超级成员,它不是NULL指针,而是指向MyClass(不是元类)的指针.非元根类的元类的超类不应该是NULL指针(作为非元根类的超类)吗?既然不是,那它应该是什么?
我问这个是因为,事实上的方式,如果methodX是MyClass根类的实例方法(不是类方法),语句[MyClass methodX]
会调用methodX(它实际上是),不应该发生什么(再次,因为methodX是实例方法,而不是类方法,所以它不应该响应[MyClass methodX]语句).
Obective-C语言特别决定了类对象应该响应其根类的实例方法.这主要是一个务实的决定; 因为NSObject主要负责处理ObjC如何与对象交互的基础,所以必须两次实现所有内容会很烦人; 一次用于类对象,一次用于实例.类对象可以因此他们需要应对投入阵列等-retain,并-release就像实例做.
您可以在本文档的"根类方法"部分中阅读更多相关信息:https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Chapters/ocObjectsClasses.html