在Objective-C中,id
是否与C中的void *
完全相同? (通用指针类型)。
如果是这样,当我们使用时
id obj = [[Fraction alloc] init];
[obj methodName];
obj = [[ComplexNumber alloc] init];
[obj anotherMethodName];
当调用该方法时,程序通过什么方式知道obj
是什么类?
id
与void *
不同。 id
是指向未知类型的Objective C对象的指针;例如C#或Java的object
数据类型。 void*
可以指向任何东西;非null id
指向所有ObjC对象共有的数据结构,并包含指向其各自类数据的指针。
ObjC运行时-alloc
/init
/ etc的实现。 -确保所有有效的对象中都有正确的类指针。
IIRC,在Apple的实现中,id
指向is的指针大小的变量,实际上是指向该类的指针。
在类的数据块中,有一系列方法将方法签名映射到指向方法实现的函数指针。从那里开始,这是一个相当简单的查找,它是在您向对象发送消息(即在其中调用方法)时在运行时发生的。也是指向基类的指针,以便方法查找可以在继承树上继续进行。
顺便说一句,这就是为什么在将消息发送到id
时取消引用void指针是编译器错误,如果这在静态上是不安全的。
Objective-C中的[id
与C中的void *
并不完全相同。]
是,id
只是一个通用指针。编译时的类解析只是为了通知用户警告和错误。但是,具有id类型的veritable在编译时不会绑定到任何特定的类。在运行时访问对象之前,不会知道实际的类。如果对象是NSObject
的子类(很可能是该子类),则您的代码可以询问该对象是什么类。]
[myObject class]
将返回myObject
的类别。 [myObject isMemberOfClass:[SomeClass class]]
将返回一个BOOL
,表明较白,因为myObject
不是类SomeClass
的成员。