Objective-C中的id类型真的是动态的吗

Objective-C中的id类型真的是动态的吗,objective-c,Objective C,id类型是真正动态的(运行时后期绑定)还是类似于C#(编译时后期绑定)中的“var”关键字 id定义为指向对象数据结构的指针: 更重要的是 id类型是完全非限制性的。它本身不会产生关于对象的任何信息,除了它是一个对象。在某些情况下,程序通常需要查找有关其所包含对象的更具体信息。由于id类型指示符无法向编译器提供此信息,因此每个对象必须能够在运行时提供此信息 isa实例变量标识对象的类它是什么类型的对象。具有相同行为(方法)和相同类型数据(实例变量)的对象是同一类的成员 因此,对象在运行时是动态类

id类型是真正动态的(运行时后期绑定)还是类似于C#(编译时后期绑定)中的“var”关键字

id定义为指向对象数据结构的指针:

更重要的是

id类型是完全非限制性的。它本身不会产生关于对象的任何信息,除了它是一个对象。在某些情况下,程序通常需要查找有关其所包含对象的更具体信息。由于id类型指示符无法向编译器提供此信息,因此每个对象必须能够在运行时提供此信息

isa实例变量标识对象的类它是什么类型的对象。具有相同行为(方法)和相同类型数据(实例变量)的对象是同一类的成员

因此,对象在运行时是动态类型化的。只要需要,运行时系统只要询问对象,就可以找到对象所属的确切类。(有关运行时的更多信息,请参见Objto-C运行时编程指南。)Objy-C中的动态类型作为动态绑定的基础,稍后讨论。
真正充满活力。它甚至没有任何静态类型检查(除非为变量声明协议列表)。它只定义为指向对象的指针。例如,您可以执行以下操作:

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]);
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]);