instancetype和id的区别

来源:互联网 发布:国产机器人仿真软件 编辑:程序博客网 时间:2024/05/16 23:01
instancetype 是只能作为返回值而不能作为参数的。
当一个类返回相同类的实例的时候使用  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方法


新人就是想写写博客,所以只是学习一下别人的文章怎么写,勿喷,参考文章:点击打开链接

0 0
原创粉丝点击