instancetype和id的区别

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值