id和instancetype的区别

id返回不确定类型的对象(也就是任意类型的对象),- (id)arrayWithData;返回的就是不确定类型的对象,如果执行数组的方法, [- (id)arrayWithData objectOfIndex:0]编译时不会报错,但运行时会报错,找不到该方法。

instancetype返回的类型是该类的对象,- (instancetype)arrayWithData;如果执行数组的方法, [- (instancetype)arrayWithData objectOfIndex:0]编译时不会报错,运行时也不会报错。

总结一下,instancetype的作用,就是使那些非关联返回类型的方法返回所在类的类型

2、好处

能够确定对象的类型,能够帮助编译器更好的为我们定位代码书写问题,比如:

  1. [[[NSArray alloc] init] mediaPlaybackAllowsAirPlay]; //  "No visible @interface for `NSArray` declares the selector `mediaPlaybackAllowsAirPlay`"    
  2. [[NSArray array] mediaPlaybackAllowsAirPlay]; // (No error)  
第一行代码,由于[[NSArray alloc]init]的结果是NSArray*,这样编译器就能够根据返回的数据类型检测出NSArray是否实现mediaPlaybackAllowsAirPlay方法。有利于开发者在编译阶段发现错误。

第二行代码,由于array不属于关联返回类型方法,[NSArray array]返回的是id类型,编译器不知道id类型的对象是否实现了mediaPlaybackAllowsAirPlay方法,也就不能够替开发者及时发现错误。
原文地址:https://www.cnblogs.com/rankilau/p/4195061.html