id是一种泛型,用于表示任何类的对象。回忆一下,对象是带有代码的Cstruct。因此,id实际上是一个指针,指向其中的某个结构。在概念上,id有点类似于java中的Object类,可以转换成任何数据类型。在内部处理上,这种类型被定义为指向对象的指针,实际上是一个指向这种对象的实例变量的指针。
下面是id在objc.h中的定义:
typedef struct objc_object {
Class isa;
} *id;
从上面看出,id 是指向struct objc_object 的一个指针。也就是说,id 是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id 是一个指针,所以在使用id的时候不需要加星号。在Objective-C中,id取代了int类型成为默认的数据类型(在C语言中,int是默认的函数返回值类型),关键字nil 被定义为空对象,也就是值为0 的对象。关于更多的Objective-C基本类型,读者可以参考obj/objc.h文件。
id shape = shapes[i];
代码从shapes数组中获取id(即指向某个对象的指针),并将其赋值给名为shape(它具有类型id)的变量。这是一种指针赋值的过程,它实际上并不会赋值shape的全部内容