id:
-
id 声明的对象具有运行时的特性,即可以指向任意类型的 Objcetive-C 的对象;
-
id 是一个 objc_object 结构体指针,定义是
typedef struct objc_object *id
-
id 可以理解为指向对象的指针, id 可以指向所有 oc 的对象,编译器不会做类型检查;
-
id 调用任何存在的方法都不会在编译阶段报错,当然如果这个 id 指向的对象没有这个方法,该崩溃还是会崩溃的。
NSObject *:
- NSObject * 指向的必须是 NSObject 的子类;
- 调用的也只能是 NSObject 里面的方法否则就要做强制类型转换;
- 不是所有的 OC 对象都是 NSObject 的子类,还有一些继承自 NSProxy;
- NSObject * 可指向的类型是 id 的子集。
instancetype:
- instancetype 只能作为返回值,编译时判断真实类型,不符合发警告。