id类型是真正动态的(运行时后期绑定)还是类似于C#中的'var'关键字(编译时的后期绑定)?
答案 0 :(得分:9)
来自The Objective-C Programming Language:
id被定义为指向对象数据结构的指针:
typedef struct objc_object {
Class isa;
} *id;
更重要的是
id类型完全不受限制。除了它是一个对象之外,它本身不会产生关于对象的信息。在某些时候,程序通常需要找到有关其包含的对象的更具体的信息。由于id类型指示符无法将此信息提供给编译器,因此每个对象都必须能够在运行时提供它。
isa实例变量标识对象的类 - 它是什么类型的对象。具有相同行为(方法)和相同类型的数据(实例变量)的对象是同一类的成员。
因此,对象在运行时动态输入。只要需要,运行时系统就可以通过询问对象来找到对象所属的确切类。 (要了解有关运行时的更多信息,请参阅Objective-C运行时编程指南。)Objective-C中的动态类型是动态绑定的基础,稍后将对此进行讨论。
答案 1 :(得分:6)
真正充满活力。甚至没有对它进行任何静态类型检查(除非您声明变量的协议列表)。它仅被定义为指向对象的指针。例如,您可以这样做:
Class classes[3];
classes[0] = [NSMutableString class];
classes[1] = [NSMutableArray class];
classes[2] = [NSMutableData class];
srandom(time(NULL));
id foo = [[classes[random % 3] alloc] init];
NSLog(@"It is a %@", [foo class]);