首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >objc_msgSend()调度表

objc_msgSend()调度表
EN

Stack Overflow用户
提问于 2014-04-28 22:29:22
回答 1查看 811关注 0票数 0

为了理解objc_msgSend(),我需要清理头脑中的一些杂乱。请慷慨地给出详细的答案。:)

这是我对Apple的理解。

当消息被发送到对象时,消息传递函数遵循对象的isa指针,指向类结构,它在调度表中查找方法选择器。如果它在那里找不到选择器,objc_msgSend()将跟随指向超类的指针(这里是混乱),并尝试爬上类层次结构。

在这里,超类是否得到为该超类分配的内存和isa指针?上面的引语是不是这么说的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-29 04:33:22

如果您查看NSObject的objc-2.0之前的声明,您会看到:

代码语言:javascript
复制
@interface NSObject <NSObject> {
    Class isa;
}

上课地点:

代码语言:javascript
复制
typedef struct objc_class *Class;

objc_class是:

代码语言:javascript
复制
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时,它首先查看描述NSMutableString实例的objc_class的方法列表。如果它找不到这个方法,它会查看super_class结构并在那里搜索。如果它在那里找不到它,它就会在super_class's super_class中查找。

也就是说,任何给定类的isa所指向的结构中的isa指针都是类层次结构上的链接列表,一直到NSObject (通常)。如果super_class字段为空,则为根类。

内存分配或多或少是以类似的方式进行的。实例的instance_size字段指定实例的大小,从而指定要分配的内存量。

或多或少。所有这些结构现在都是不透明的。正如Richard在评论中所说的,,您必须使用内省函数来获取这些结构的内容,。这使得苹果可以在不需要重新编译所有内容的情况下更改实现细节。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23352289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档