Objective-C中instancetype和id的区别
要区分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的区别的更多相关文章
- 42.OC中instancetype与id的区别
区别: 在ARC(Auto Reference Count)环境下: instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型,运行时检查类型 在MRC(Manual Re ...
- OC中instancetype与id的区别
1.在ARC环境下: instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型, 运行时检查类型. 2.在MRC环境下: instancetype和id一样,不做具体类型检 ...
- Objective-C中的instancetype与id的区别
一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以 ...
- [转]html js中name和id的区别和使用分析
js中web页面元素的调用可以有两种识别方法:id和name 自己在用的过程中总结一下id和name的使用区别. 一,使用范围 除 BASE, HEAD, HTML, META, SCRIPT, ST ...
- instancetype和id的区别
一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以 ...
- instancetype 和 id 的区别
原文:http://blog.csdn.net/sirodeng/article/details/50516478 一.什么是instancetype instancetype是clang 3.5开始 ...
- Windows中句柄和ID的区别
写在前面:这里介绍句柄 对于“句柄”,在下一直停留在一知半解的认识层面,近日在下学习Windows编程,决定趁此机会将句柄彻底搞清楚.查阅了一些网络上的资料,发现网络上的讲解大概可以分为两类:一种是以 ...
- input中name和id的区别
一直很困惑,表单里面input标签有id和name,它们之间到底有什么区别自己很少去想,只知道一般的场景该怎么使用,今天就在网上搜索了一下,自己也总结一下.为什么有了ID还要有Name呢?其实ID就像 ...
- JS中class和id的区别
class和id的区别 class用于css的,id用于js的. 1)class页面上可以重复.id页面上唯一,不能重复. 2)一个标签可以有多个class,用空格隔开.但是id只能有id.
随机推荐
- 求最小生成树(Prim算法)(1075)
Description 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经给出了部分代码,你只需要完善Prim算法即可. Input 第一行为图的顶点个数n ...
- findstr 只搜寻指定文件类型
Title:findstr 只搜寻指定文件类型 --2012-05-04 09:27 findstr /i /m /S /C:"关键字" *.php *.asp *.jsp
- Moxon(摩克森)天线介绍
一.Moxon(摩克森)天线介绍Moxon天线是一种方形天线,性质上类似二单元Yagi(八木),增益高,具有很强的方向性,按尺寸做好后几乎不用调试,阻抗50欧姆.在U段,天线尺寸小,便于携带,是一款非 ...
- MFC中DoDataExchange()的作用
void CDlgSelectCS::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Te ...
- 2013第39周一Web打印
2013第39周一Web打印 项目中遇到了Java Web打印问题,简单调用IE浏览器的打印不能完全满足要求,于是就搜集了Web打印相关的主题,简单汇总一下.web打印难点在分页.页面纸张设置,页眉页 ...
- SPOJ--K-query (线段树离线) 离线操作解决一些问题
K-query Given a sequence of n numbers a1, a2, ..., an and a number of k- queries. A k-query is a tri ...
- 素数与素性测试(Miller-Rabin测试)
转载自Matrix大牛的博客 把代码翻译成C++ http://www.matrix67.com/blog/archives/234 题目链接: http://hihocoder.com/proble ...
- vs2010 sp1 创建silverlight 时,提示我 “在创建silverlight项目之前,您需要安装最新的silverlight Developer运行时
---恢复内容开始--- Silverlight 5 Developer Rumtime (32bit): http://go.microsoft.com/fwlink/?LinkId=229323 ...
- POJ 2886 Who Gets the Most Candies? 线段树。。还有方向感
这道题不仅仅是在考察线段树,还他妹的在考察一个人的方向感.... 和线段树有关的那几个函数写了一遍就对了,连改都没改,一直在转圈的问题的出错.... 题意:从第K个同学开始,若K的数字为正 则往右转, ...
- 自定义input file样式
自定义input file样式:一般都是通过隐藏input,通过定义label来实现.这种做法要注意的是label的for属性要指定input对应的id; <!DOCTYPE html> ...