instancetype 是只能作为返回值而不能作为参数的。
当一个类返回相同类的实例的时候使用 instancetype 是合适的。
对于编译器来说以下两个是一样的,因为编译器会将①自动转换为②
①-(id)init;
但如果不是init(非关联返回类型)的话结果就不一样了
① +(id)buildInstance;(返回的还是id类型)
②+(instancetype) buildInstance; (返回的是instancetype类型)
下面放一个例子
但如果把-(id)buildInstance;改为-(instancetype)buildInstance;
当一个类返回相同类的实例的时候使用 instancetype 是合适的。
对于编译器来说以下两个是一样的,因为编译器会将①自动转换为②
①-(id)init;
②-(instancetype)init;
即关联返回类型会被编译器自动转换:
1、类方法中,以alloc或new开头
2、实例方法中,以autorelease,init,retain或self开头
但如果不是init(非关联返回类型)的话结果就不一样了
① +(id)buildInstance;(返回的还是id类型)
②+(instancetype) buildInstance; (返回的是instancetype类型)
下面放一个例子
@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方法
新人就是想写写博客,所以只是学习一下别人的文章怎么写,勿喷,参考文章:点击打开链接