为了理解objc_msgSend(),我需要清理头脑中的一些杂乱。请慷慨地给出详细的答案。:)
这是我对Apple的理解。
当消息被发送到对象时,消息传递函数遵循对象的isa指针,指向类结构,它在调度表中查找方法选择器。如果它在那里找不到选择器,objc_msgSend()将跟随指向超类的指针(这里是混乱),并尝试爬上类层次结构。
在这里,超类是否得到为该超类分配的内存和isa指针?上面的引语是不是这么说的?
发布于 2014-04-29 04:33:22
如果您查看NSObject的objc-2.0之前的声明,您会看到:
@interface NSObject <NSObject> {
Class isa;
}上课地点:
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时,它首先查看描述NSMutableString实例的objc_class的方法列表。如果它找不到这个方法,它会查看super_class结构并在那里搜索。如果它在那里找不到它,它就会在super_class's super_class中查找。
也就是说,任何给定类的isa所指向的结构中的isa指针都是类层次结构上的链接列表,一直到NSObject (通常)。如果super_class字段为空,则为根类。
内存分配或多或少是以类似的方式进行的。实例的instance_size字段指定实例的大小,从而指定要分配的内存量。
或多或少。所有这些结构现在都是不透明的。正如Richard在评论中所说的,,您必须使用内省函数来获取这些结构的内容,。这使得苹果可以在不需要重新编译所有内容的情况下更改实现细节。
https://stackoverflow.com/questions/23352289
复制相似问题