OC语言 - id | instancetype
前言
1 - 动态数据类型的特点
① 在编译的时编译器并不知道变量的真实类型,只有在运行时才知道它的真实类型
② 在编译阶段,即使访问了不属于动态类型数据的属性和方法,编译器也不会报错
id
1 - 它是一种动态数据类型,也是万能指针,能够指向或操作任何对象
1 Typedef struct objc object{ 2 Class isa; 3 } *id;
2 - id 也常用来定义变量、作为返回值、用作参数
① 坏处:在运行阶段如果调用了一个不存在的方法,编译器会马上报错!编译阶段无法发现语法错误,可读性不高
② 好处:灵活,可以指向任何对象类型;编译阶段不指向任何类型
instancetype
1 - instancetype、id 都是万能指针,指向一个对象。而 instancetype 在编译的时候,就会判断对象的真实类型
2 - instancetype 在错误检查机制上更优于 id。因为 instancetype 能够在无关联返回类型中明确地返回该对象的类型,因此更利于开发者检测到无关联返回类型中的错误。而 id 返回的是未知类型,在无关联返回类型中检错时没有 instancetype 更易于查错
小结
1 - 但凡自定义的构造方法,返回值尽量使用 instancetype且它只能用于作为返回值
2 - 尽量不要把 id 当做返回值来使用