id的声明
在usr/include /objc / objc.h里面有:
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
所以,id可以用于指向所有的Objective-C对象,是一种万能指针,类似于C语言中的void*。
NSObject *
NSObject *可以指向所有继承自NSObject的类生成的对象。在Objective-C中,几乎所有类都是继承自NSObject,但是也有例外,比如NSProxy就并非继承自NSObject。
所以,NSObject *能够指向的范围比id要小一些。
id表示基础类型
其实,id 还可以表示基础类型,但是不能表示float,double类型。
在MRC中,id可以表示int、NSInteger、BOOL等类型(虽然会有警告),但是在ARC中会报错。即使在MRC中,也不能表示float,double类型。
id的作用
1、可以用于动态绑定。编译器看到id以后,认为是动态类型,不再检查类型。
2、多态, 可以减少代码量, 避免调用子类特有的方法需要强制类型转换
3、可以用于代理(delegate)。在声明代理的时候,根本不用关心代理的类型是什么。
4、有的时候,你不知道变量的类型,就可以使用id。比如,在一个存储着NSString和NSNumber和数组中,想要找出所有的字符串。由于不确定取出的元素是哪种类型,就可以使用id进行声明,然后再判断类型。