OC中instancetype与id的区别

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
{

}
原文地址:https://www.cnblogs.com/fengmin/p/6140001.html