要区分instancetype和id,首先要弄清楚什么是关联返回类型(Related Result Type)。

关联返回类型即一个方法的返回类型就是调用这个方法的调用者的类型。具有下列条件的方法具有关联返回类型:

1 对于静态方法,方法名以alloc,new开头;

2 对于实例方法,方法名以autorelease,init,retain,self开头

关联返回类型的作用就是让编译器在编译期就可以进行类型检测(Type Check),比如下面的例子:

@interface X : NSObject

@property (assign, nonatomic) NSInteger index;

+ (id)create;

@end

@implementation X

+ (id)create {
X *x = [[X alloc] init]; return x;
} @end @interface Y : NSObject /**
*工程中如果不存在一个方法叫haha,即使create的返回值是id
*编译器也会报错:No known instance method for selector 'haha'
*/
- (void)haha; @end

然后进行如下调用:

[[X create] haha];

由于类X的create方法命名不符合关联返回类型的要求,因此编译器无法推断出该方法返回的就是一个X类型,而是只把返回值看成是id类型。又由于方法haha在工程中存在,因此可以成功编译。(但是运行时仍然会报错:unrecognized selector sent to instance)。

为了让不具备关联返回类型命名的方法也可以让编译器进行正确的推断,从而在编译期进行类型检查,就需要将返回的id类型换成instancetype。如果将上面例子中,把create方法的返回类型换成instancetype,编译器在编译的时候就会知道create方法返回的是一个X类型,而X类型没有声明haha方法,因此在编译器就会报错:

No visible @interface for 'X' declares the selector 'haha'

但是,与id不一样,id除了作为方法的返回类型,同时可以作为方法的参数以及声明变量,而instancetype只能作为方法的返回类型。

关于关联返回类型还有一点,如果子类override了父类的一个关联返回类型方法,那么子类的返回类型必须要么是子类本身,要么是父类(即可以兼容子类的类型)。

参考资料:

http://blog.csdn.net/kuizhang1/article/details/18048829

http://clang.llvm.org/docs/LanguageExtensions.html#objective-c-features

http://nshipster.com/instancetype/

Objective-C中instancetype和id的区别的更多相关文章

  1. 42.OC中instancetype与id的区别

    区别: 在ARC(Auto Reference Count)环境下: instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型,运行时检查类型 在MRC(Manual Re ...

  2. OC中instancetype与id的区别

    1.在ARC环境下: instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型, 运行时检查类型. 2.在MRC环境下: instancetype和id一样,不做具体类型检 ...

  3. Objective-C中的instancetype与id的区别

    一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以 ...

  4. [转]html js中name和id的区别和使用分析

    js中web页面元素的调用可以有两种识别方法:id和name 自己在用的过程中总结一下id和name的使用区别. 一,使用范围 除 BASE, HEAD, HTML, META, SCRIPT, ST ...

  5. instancetype和id的区别

    一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以 ...

  6. instancetype 和 id 的区别

    原文:http://blog.csdn.net/sirodeng/article/details/50516478 一.什么是instancetype instancetype是clang 3.5开始 ...

  7. Windows中句柄和ID的区别

    写在前面:这里介绍句柄 对于“句柄”,在下一直停留在一知半解的认识层面,近日在下学习Windows编程,决定趁此机会将句柄彻底搞清楚.查阅了一些网络上的资料,发现网络上的讲解大概可以分为两类:一种是以 ...

  8. input中name和id的区别

    一直很困惑,表单里面input标签有id和name,它们之间到底有什么区别自己很少去想,只知道一般的场景该怎么使用,今天就在网上搜索了一下,自己也总结一下.为什么有了ID还要有Name呢?其实ID就像 ...

  9. JS中class和id的区别

    class和id的区别 class用于css的,id用于js的. 1)class页面上可以重复.id页面上唯一,不能重复. 2)一个标签可以有多个class,用空格隔开.但是id只能有id.

随机推荐

  1. Css3执行后显示最后一针

    -webkit-animation-fill-mode: both; animation-fill-mode: both;

  2. CSS中常用中文字体转Unicode编码表

    中文名 英文名 Unicode Unicode 2 Mac OS 华文细黑 STHeiti Light [STXihei] \534E\6587\7EC6\9ED1 华文细黑 华文黑体 STHeiti ...

  3. 类似a:hover的伪类的注解

    a:link { font-size: 14pt; text-decoration: underline; color: blue; } /*设置a对象在未被访问前的样式表属性 .*/ a:hover ...

  4. oschina大数据开源软件

    Hadoop 图形化用户界面 Hue 大数据可视化工具 Nanocubes 企业大数据平台 RedHadoop 大数据查询引擎 PrestoDB Hadoop集群监控工具 HTools 安全大数据分析 ...

  5. HDOJ(HDU) 1563 Find your present!(异或)

    Problem Description In the new year party, everybody will get a "special present".Now it's ...

  6. Java ConcurrentHashmap 解析

    总体描述: concurrentHashmap是为了高并发而实现,内部采用分离锁的设计,有效地避开了热点访问.而对于每个分段,ConcurrentHashmap采用final和内存可见修饰符Volat ...

  7. flume的自定义sink-Kafka

    1.创建一个agent,sink类型需指定为自定义sink        vi /usr/local/flume/conf/agent3.conf        agent3.sources=as1  ...

  8. solr索引

    solr索引 当我们真正进入到Lucene源代码之中的时候,我们会发现: • Lucene的索引过程,就是按照全文检索的基本过程,将倒排表写成此文件格式的过程. • Lucene的搜索过程,就是按照此 ...

  9. 原生js实现轮播

    1,效果图 https://ga20.github.io/slider/ 2,原理图 分三步: 将视口元素设置overflow:hidden 将其图片子元素设置float:left 让橙色的框(包裹) ...

  10. js-权威指南学习笔记4

    第五章 语句 1.在JS中没有块级作用域,在语句块中声明的变量并不是语句块私有的. 2.尽管函数声明语句和函数定义表达式具有相同的函数名,但二者仍然不同.两种方式都创建了新的函数对象,但函数声明语句中 ...