objective-c - 在 Objective-C 中, "id"是否与 C 中的 "void *"相同,程序在方法调用期间如何告诉类?

标签 objective-c

在 Objective-C 中,id 是否与 C 中的 void * 完全相同? (通用指针类型)。

如果是这样,当我们使用

id obj = [[Fraction alloc] init];
[obj methodName];
obj = [[ComplexNumber alloc] init];
[obj anotherMethodName];

调用方法时,程序通过什么方式知道obj是什么类?

最佳答案

idvoid * 不同。 id 是指向未知类型的 Objective C 对象的指针;就像 C# 或 Java 的 object 数据类型。 void* 可以指向任何东西;非零 id 应指向所有 ObjC 对象共有的数据结构,并包含指向其各自类数据的指针。

ObjC 运行时 - alloc/init/etc 的实现。 - 确保所有有效对象中都有正确的类指针。

IIRC,在 Apple 的实现中,id 指向 的指针大小的变量是,实际上是指向类的指针。

在类的数据 block 中,有一个方法列表,将方法签名映射到指向方法实现的函数指针。从那里开始,这是一个相当简单的查找,当您向对象发送消息(即调用方法)时,它会在运行时发生。也是一个指向基类的指针,以便方法查找可以在继承树中继续向上。

顺便说一句,这就是为什么取消引用 void 指针是编译器错误,而向 id 发送消息是合法的,如果静态不安全的话。

关于objective-c - 在 Objective-C 中, "id"是否与 C 中的 "void *"相同,程序在方法调用期间如何告诉类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10273785/

相关文章:

ios - 为什么我不能将我的 UITextView 连接到我的 .m 文件?

ios - 如何定义可以从两个不同的类初始化的变量?

objective-c - 你必须在 UIButton 上调用 removeTarget 吗?

objective-c - 以编程方式将 NSButton 实例添加到 NSWindow

ios - 在 UIScrollView 中添加文本字段时按钮消失

ios - 使用 NSPredicate 在类似于 SQL WHERE IN 子句的 NSArray 中查找元素

ios - 带有尾随约束约束不稳定问题的 Objective-c 动画

ios - 确定 NSString 编码

objective-c - 如何使用 swift 或 objective-c 以编程方式更改 macosx cocoa 应用程序中系统光标的大小?

ios - UITableViewCell 选中的按钮在滚动 UITableView 时变为未选中状态