我需要在脑海中清除一些杂乱的东西来理解objc_msgSend()。 请慷慨解囊请给出详细解答。 :)
以下是我对Apple Doc。
的理解当消息发送到对象时,消息传递功能如下 对象的isa指向它查找的类结构的指针 调度表中的方法选择器。如果它找不到选择器 在那里,objc_msgSend()跟随指向supperclass的指针(HERE是 混乱)并试图爬上阶级等级。
这里,超类是否获得了内存分配,并且isa指针可用于该超类?以上引用是否说明了这一点?
答案 0 :(得分:4)
如果你看一下NSObject的ObjC-2.0前声明,你会看到:
@interface NSObject <NSObject> {
Class isa;
}
Class是:
typedef struct objc_class *Class;
objc_class是:
struct objc_class {
struct objc_class *isa;
struct objc_class *super_class;
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
struct objc_method_list **methodLists;
struct objc_cache *cache;
struct objc_protocol_list *protocols;
};
因此,isa
指针 - NSObject
中的第一个字段,也是每个子类中的第一个字段 - 是指向objc_class
结构的指针。结构的其余部分描述了该类的详细信息。 super_class
字段指向描述超类的objc_class
结构。
当objc_msgSend()
尝试将方法分派给NSMutableString
时,它首先会查看描述objc_class
实例的NSMutableString
的方法列表。如果它找不到该方法,它会查看super_class
结构并在那里搜索。如果它无法在那里找到它,那么它会查看super_class
super_class
。
即。任何给定类的super_class
指向的结构中的isa
指针是类层次结构的链接列表,一直到NSObject
(通常)。如果super_class
字段为空,则该字段为根类。
内存分配或多或少以类似的方式完成。实例的instance_size
字段指定实例的大小,从而指定要分配的内存量。
或多或少。所有这些结构现在都是不透明的。正如Richard Ross III在评论中所说,你必须使用内省函数来获取这些结构的内容。这允许Apple更改实现细节,而无需重新编译所有内容。