objc_msgSend()调度表

时间:2014-04-28 22:29:22

标签: ios objective-c

我需要在脑海中清除一些杂乱的东西来理解objc_msgSend()。 请慷慨解囊请给出详细解答。 :)

以下是我对Apple Doc。

的理解
  

当消息发送到对象时,消息传递功能如下   对象的isa指向它查找的类结构的指针   调度表中的方法选择器。如果它找不到选择器   在那里,objc_msgSend()跟随指向supperclass的指针(HERE是   混乱)并试图爬上阶级等级。

这里,超类是否获得了内存分配,并且isa指针可用于该超类?以上引用是否说明了这一点?

1 个答案:

答案 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更改实现细节,而无需重新编译所有内容。