instancetype 是只能作为返回值而不能作为参数的。
当一个类返回相同类的实例的时候使用 instancetype 是合适的。
对于编译器来说以下两个是一样的,因为编译器会将①自动转换为②
①-(id)init;
②-(instancetype)init;
但如果不是init的话结果就不一样了
① +(id)buildInstance;
②+(instancetype) buildInstance;
下面放一个例子
@interface Foo : NSObject
+(id)buildInstance;(非关联返回类型方法)-(id)init;(关联返回类型方法)@end
@implementation Foo+(id)buildInstance{return [[self alloc] init];}-(id)init{return [super init];}@end
@interface Bar : Foo- (void)doSometingElse;@end
@implementation Bar- (void)doSometingElse {}@end
[[[Foo alloc] init] doSometingElse];//返回的是foo类的实例,因为编译器会自动把id转换为instancetype,所以会有警告说无dosometingelse方法
[[[Bar alloc] init] doSometingElse];//返回的是bar类的实例
[[Foo buildInstance] doSometingElse];//返回的可以是bar类的实例,因为不是init编译器不会把id转换为instancetype,所以不会有警告[[Bar buildInstance] doSometingElse];//返回的是bar类的实例
但如果把-(id)buildInstance;改为-(instancetype)buildInstance;
则[[Foo buildInstance] doSometingElse];会有警告,因为返回的是foo类的实例,无dosometingelse方法
网友评论