gpt4 book ai didi

ios - objc_msgSend() 调度表

转载 作者:行者123 更新时间:2023-11-28 19:02:43 26 4
gpt4 key购买 nike

我需要理清思路才能理解 objc_msgSend()。请慷慨地提供详细答案。 :)

这是我对 Apple Doc 的理解。

When a message is sent to an object, the messaging function follows the object's isa pointer to the class structure where it looks up the method selector in the dispatch table. If it cant find the selector there, objc_msgSend() follows the pointer to the supperclass (HERE is confusion) and tries to climb the class hierarchy.

在这里,父类(super class)是否分配了内存并且是一个可用于该父类(super class)的指针?上面的引述是这样说的吗?

最佳答案

如果您查看 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 字段指向描述父类(super class)的 objc_class 结构。

objc_msgSend() 尝试分派(dispatch)一个方法给一个 NSMutableString 时,它首先会查看 objc_class 的方法列表描述一个 NSMutableString 实例。如果它没有找到该方法,它会查看 super_class 结构并在那里进行搜索。如果在那里找不到它,它就会在 super_classsuper_class 中查找。

即任何给定类的 isa 指向的结构中的 super_class 指针是类层次结构中一直到 NSObject 的链表(通常)。如果 super_class 字段为空,那将是一个根类。

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

或多或少。所有这些结构现在都是不透明的。正如 Richard Ross III 在评论中所说,您必须使用内省(introspection)函数来获取这些结构的内容。这允许 Apple 更改实现细节,而无需重新编译所有内容。

关于ios - objc_msgSend() 调度表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23352289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com