instancetype是clang3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象。

instancetype只能作为返回值,不能像id那样作为参数。

使用 instancetype 返回的一定是调用该方法的实例,而id则不一定,因为id是作为一个范型来使用的

相同点:都可以作为方法的返回类型

①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;

②instancetype只能作为返回值,不能像id那样作为参数

使用instancetype有三点好处:

1、明确性。代码只做你让它做的事,而不是其他。

2、程式化。你会养成好习惯,这些习惯在某些时候会很有用,而且肯定有用武之地。

3、一致性。让代码可读性更好。

用instancetype代替init作为返回值的确没有技术上的好处。但这是因为编译器自动将id转化成了instancetype。你以为init返回的值类型是id,其实编译器返回了instancetype。

在写一条返回id的消息前,问自己:这个类返回实例吗?如果返回,用instancetype。

肯定有需要返回id的时候,但你用instancetype的频率应该会更高