一 概述
instancetype是clang 3.5开始提供的一个关键字,与id一样表示某个方法返回未知类型的Objective-C对象。
二 关联返回类型和非关联返回类型
1,关联返回类型
根据Cocoa的命名规则,满足下述风格的方法:
- 类方法中,以alloc,new开头
- 实例方法中,以init,autorelease,retain,self开头
会返回这个方法所在类的类型的对象,这些方法就是关联返回类型方法。即这些方法返回的结果,以方法所在的类为类型。
@interface NSObject
+ (instancetype)alloc
- (instancetype)init
我们使用如下方法初始化时:
NSArray *array = [[NSArray alloc] init];
按照Cocoa的命名规则,[NSArray alloc]与[[NSArray alloc]init]返回的都为NSArray的对象。
2,非关联返回类型
除了关联返回类型的几种方法,其他都是非关联的。
@interface NSArray
+ (id)constructAnArray;
+ (instancetype)constructAnArray;
@end
当我们使用上述方法初始化NSAarry时:
[NSArray constructAnArray];
- 如果返回类型是id,则代表不确定返回对象是什么类型
- 如果是instancetype,则返回对象类型确定是NSArray*
instancetype最大的特点就是使非关联返回类型的方法返回所在类的类型
三 使用区别
- id在编译的时候不能判断对象的真实类型
instancetype在编译的时候可以判断对象的真实类型 - 如果init方法的返回值是instancetype,那么将返回值赋值给一个其它类型对象会报一个警告
如果是在以前, init的返回值是id,那么将init返回的对象地址赋值给其它对象是不会报错的 - id可以用来定义变量, 可以作为返回值, 可以作为形参
instancetype只能用于作为返回值
四 总结
我们自定义构造方法时,返回值尽量写instancetype,不要用id