相同点
都可以作为方法的返回类型
不同点
①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象
+ (id)appWithArray:(NSArray *)array;
LZApp *app = [LZApp appWithArray:array];
NSString *string = [LZApp appWithArray:array]; (因为id是未知类型,系统不报错,运行后崩溃)
+ (instancetype)appWithArray:(NSArray *)array;
LZApp *app = [LZApp appWithArray:array];
NSString *string = [LZApp appWithArray:array]; (系统⚠️提示,因为类型不一致)
②instancetype只能作为返回值,不能像id那样作为参数
- (void)setValue:(instancetype)value; // 报错
- (void)setValue:(id)value; // 正确