1、在ARC环境下:
instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型, 运行时检查类型。
2、在MRC环境下:
instancetype和id一样,不做具体类型检查。
id 可以作为方法参数传递, intancetype 不能。
id 可以去接受对象, instancetype不能
在自定义初始化或者便利构造方法中尽量使用instancetype作为返回值类型,保证类型安全
当我们初始化 NSArray时
NSArray * array = [[NSArray alloc] init];
[NSArray alloc]返回类型属于关联返回类型,NSArray *
instancetype
假如一个不是关联返回类型的方法
@interface NSArray +(id)constructAnArray; @end
当我们初始化的时候
[NSArray constructAnArray]
得到返回类型和方法声明的返回类型一样,是id
如果使用 instancetype 作为返回类型
@interface NSArray +(instancetype)constructAnArray; @end
同样方式初始化
[NSArray constructAnArray]
得到的返回类型和方法所在类型相同,是 NSArray *
instancetype的作用,就是使那些非关联返回类型的方法返回所在类的类型!
好处:确定对象类型帮编译器更好定位代码问题。
相同点:
作为方法的返回类型
不同点:
1、instancetype 可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象。
2、instancetype只能作为返回值,id可以作为参数.
-(void)setValue:(instancetype)value { } 报错! 应该写成 -(void)setValue:(id)value { }