在Objective C中,id与void *C 完全相同?(通用指针类型).
如果是这样,我们使用的时候
id obj = [[Fraction alloc] init];
[obj methodName];
obj = [[ComplexNumber alloc] init];
[obj anotherMethodName];
Run Code Online (Sandbox Code Playgroud)
当调用该方法时,程序以什么方式知道哪个类obj是什么?
id是不一样的void *.id是指向未知类型的Objective C对象的指针; 喜欢objectC#或Java 的数据类型.A void*可以指出任何事情; 一个非空id,预计在数据结构,这是通用于所有ObjC对象和包含一个指向各自的类数据点.
ObjC运行时 - alloc/ init/ etc 的实现. - 确保所有有效对象都包含正确的类指针.
IIRC,在苹果的实施指针大小的变量id指向的就是,其实指针类.
在类的数据块中,有一个方法列表将方法签名映射到方法实现的函数指针.从那里开始,当您向对象发送消息(即调用方法)时,这是一个相当简单的查找.也是指向基类的指针,以便方法查找可以继续继承树.
顺便说一下,这就是为什么在向id静态指针发送消息时,如果静态不安全,则将消息指针解析为编译器错误的原因是合法的.
idObjective-C中的内容与C中的内容完全不同void *.
来自Apple的"Objective-C编程语言":
typedef struct objc_object {
Class isa;
} *id;
Run Code Online (Sandbox Code Playgroud)
这意味着,id是一个指向objc_object结构的指针,它与指向的结构不同void.
因此,每个对象都有一个
isa变量,告诉它它是一个实例的类.由于Class类型本身被声明为指针.
typedef struct objc_class *Class;
Run Code Online (Sandbox Code Playgroud)
关于,程序如何在方法调用期间告诉类?,这是来自上面引用的相同编程指南:
该
isa实例变量标识对象的类 -什么样的对象是的.具有相同行为(方法)和相同类型的数据(实例变量)的对象是同一类的成员.因此,对象在运行时动态输入.只要需要,运行时系统就可以通过询问对象来找到对象所属的确切类.(要了解有关运行时的更多信息,请参阅 Objective-C运行时编程指南.)
根据引导,id,nil,和其他基本类型的Objective-C的都在头文件中定义objc/objc.h.
| 归档时间: |
|
| 查看次数: |
1561 次 |
| 最近记录: |