instancetype和id的区别

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方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • instancetype clang 3.5 提供的关键字, 表示:某方法返回未知类型的OC对象 都知道id任意...
    zfl1024阅读 211评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,080评论 19 139
  • 相同点:instanceType和id都是作为方法的返回类型而被使用。 不同点: 1.instancetype可以...
    zero_zql阅读 523评论 0 0
  • 1. 相同点 都可以作为方法的返回类型,省去具体类型,提高代码的通用性。 2. 不同点 instancetype会...
    奋斗的蜗牛阅读 339评论 0 0
  • //问题1:instancetype和id区别?答:instancetype只能作为返回值而id可以作为属性,参数...
    MarkTang阅读 366评论 0 2