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.
随机推荐
- 使用telnet操作memcache,一般不常用
使用telnet操作memcache,一般不常用 1.使用方法 1. 连接到memcached telnet 192.168.1.100 11211 add name 0 60 5 [说明 ...
- Android Init进程命令的执行和服务的启动
这里开始分析init进程中配置文件的解析,在配置文件中的命令的执行和服务的启动. 首先init是一个可执行文件,它的对应的Makfile是init/Android.mk. Android.mk定义了i ...
- Python----Tornado安装
Tornado安装,环境准备: 1.python安装包及安装 2.Tornado安装包 Python包安装 Linux下安装 如果使用的是 Linux系统 或 Mac OS X ,系 ...
- 大整数算法[11] Karatsuba乘法
★ 引子 前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...
- console调试--转
目录: 一.什么是 Console 二 .什么浏览器支持 Console 三.为什么不直接使用 alert 或自己写的 log 四.console.log(object[,object,.....]) ...
- 『软件介绍』SQLServer2008 基本操作
0x 01 连接数据库 Win7下,先打开SQLServer管理工具(开始菜单/所有程序/Microsoft SQL Server 2008/SQL Server Management Studio) ...
- Sicily 1129. ISBN
题目地址:1129. ISBN 思路: 这道题比较简单,只要看懂题目就应该可以了.那就解释下题目好了,题目意思是按照权值计算这10个数字和,依据这个和计算还差多少可以对11整除,若还差10,那么在这个 ...
- Android百度地图默认位置中心点设置
//初始化地图 MapView mMapView = (MapView) findViewById(R.id.map); BaiduMap mBaidumap = mMapView.getMap ...
- nmap svn
http://stackoverflow.com/questions/13296361/nmap-and-svnlib-client-not-working-together http://nmap. ...
- Misha and Changing Handles
Description Misha hacked the Codeforces site. Then he decided to let all the users change their hand ...