OC中instancetype与id的区别

我们在查找API的时候,经常都会见到instancetype和id,他们区别并不大,都可以代表任何类型的对象.但是他俩还是有细微的差别的,接下来让我们一步步去揭开他俩的面纱.

我们首先创建一个工程,新建一个Person类和一个Student类,并且Student类继承自Person类.

Person类里面包含一个便利构造器+ (id)person;
Student里面写一个简单的实例方法(-号方法)- (void )test;

另外在说instancetype与id的区别之前,首先需要补充一个知识:当父类的便利构造器想要被子类继承的话,在父类的便利构造器中要使用[self alloc]来创建对象,这样才能使子类调用父类的便利构造器.

我们在主函数main.m中用Person的便利构造器来创建Student对象,同时调用test方法.

person类方法的返回值为id时,直接报错

接下来,我们把环境改成MRC.

在MRC环境下,仅仅是警告,而且可以运行成功,并打印结果
上面的是peron类方法返回值为id的情况下出现的问题,接下来,我们看在环境ARC下,返回值为instancetype会是怎么样的结果?

在ARC环境下,返回值为instancetype,依然可以运行成功

同样的在MRC环境中,依然可以运行成功.通过简单的例子,我们可以看到instancetype和id的区别如下:

区别1:

在ARC(Auto Reference Count)环境下:

instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型, 运行时检查类型.

在MRC(Manual Reference Count)环境下:

instancetype和id一样,不做具体类型检查

区别2:

id可以作为方法的参数,但instancetype不可以

instancetype只适用于初始化方法和便利构造器的返回值类型

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

推荐阅读更多精彩内容

  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 6,789评论 1 6
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,899评论 18 399
  • 前言:面试笔试都是必考语法知识点。请认真复习和深入研究OC。 目录:iOS-面试题-OC基础篇 (1) - (84...
    麦穗0615阅读 9,692评论 0 33
  • 下面是我最近两年学习OC中的一些基础知识,对于学习OC基础知识的人可能有些帮助,拿出来分享一下,还是那句话不喜勿喷...
    小小赵纸农阅读 7,530评论 1 7
  • 聊天是件简单的事,但通过聊天让人觉得你懂我,其实是件极不简单的事。 学会聊天,广义上讲可以掌握一种行之有效的社交技...
    知课ZOKO阅读 4,492评论 0 3