在Objective-C中,“ id”与C中的“ void *”相同,并且程序在方法调用期间如何告诉类?

问题描述 投票:6回答:3

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

如果是这样,当我们使用时

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

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

objective-c
3个回答
5
投票

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

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

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

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

顺便说一句,这就是为什么在将消息发送到id时取消引用void指针是编译器错误,如果这在静态上是不安全的。


5
投票

Objective-C中的[id与C中的void *并不完全相同。]


1
投票

是,id只是一个通用指针。编译时的类解析只是为了通知用户警告和错误。但是,具有id类型的veritable在编译时不会绑定到任何特定的类。在运行时访问对象之前,不会知道实际的类。如果对象是NSObject的子类(很可能是该子类),则您的代码可以询问该对象是什么类。]

[myObject class]将返回myObject的类别。 [myObject isMemberOfClass:[SomeClass class]]将返回一个BOOL,表明较白,因为myObject不是类SomeClass的成员。

© www.soinside.com 2019 - 2024. All rights reserved.