(转)Objective-C中的instancetype和id区别
有一个相同两个不同。相同
Written by Mattt Thompson on Dec 10th, Objective-C is a rapidly evolving language, in a way that you just don't see in established programming languages. ARC, object literals, subscripting, blocks: in the span of just three years, so much of how we program in Objective-C has been changed (for the better). All of this innovation is a result of Apple's philosophy of vertical integration. Just as Apple's investment in designing its own chipsets gave them leverage to compete aggressively with their mobile hardware, so too has their investment in LLVM allowed their software to keep pace. Clang developments range from the mundane to paradigm-changing, but telling the difference takes practice. Because we're talking about low-level language features, it's difficult to understand what implications they may have higher up with API design. One such example is instancetype, the subject of this week's article. In Objective-C, conventions aren't just a matter of coding best-practices, they are implicit instructions to the compiler. For example, alloc and init both have return types of id, yet in Xcode, the compiler makes all of the correct type checks. How is this possible? In Cocoa, there is a convention that methods with names like alloc, or init always return objects that are an instance of the receiver class. These methods are said to have a related result type. Class constructor methods, although they similarly return id, don't get the same type-checking benefit, because they don't follow that naming convention. You can try this out for yourself: [[[NSArray alloc] init] mediaPlaybackAllowsAirPlay]; // ❗ "No visible @interface for `NSArray` declares the selector `mediaPlaybackAllowsAirPlay`" [[NSArray array] mediaPlaybackAllowsAirPlay]; // (No error) Because alloc and init follow the naming convention for being a related result type, the correct type check against NSArray is performed. However, the equivalent class constructor array does not follow that convention, and is interpreted as id. id is useful for opting-out of type safety, but losing it when you do want it sucks. The alternative, of explicitly declaring the return type ((NSArray *) in the previous example) is a slight improvement, but is annoying to write, and doesn't play nicely with subclasses. This is where the compiler steps in to resolve this timeless edge case to the Objective-C type system: instancetype is a contextual keyword that can be used as a result type to signal that a method returns a related result type. For example: @interface Person
+ (instancetype)personWithName:(NSString *)name;
@end instancetype, unlike id, can only be used as the result type in a method declaration. With instancetype, the compiler will correctly infer that the result of +personWithName: is an instance of a Person. Look for class constructors in Foundation to start using instancetype in the near future. New APIs, such as UICollectionViewLayoutAttributes are using instancetype already. 下面的翻译:原文地址:http://blog.csdn.net/wzzvictory/article/details/16994913 一、什么是instancetype instancetype是clang .5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象。我们都知道未知类型的的对象可以用id关键字表示,那为什么还会再有一个instancetype呢?
二、关联返回类型(related result types) 根据Cocoa的命名规则,满足下述规则的方法: 、类方法中,以alloc或new开头 、实例方法中,以autorelease,init,retain或self开头 会返回一个方法所在类类型的对象,这些方法就被称为是关联返回类型的方法。换句话说,这些方法的返回结果以方法所在的类为类型,说的有点绕口,请看下面的例子:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片 @interface NSObject
+ (id)alloc;
- (id)init;
@end @interface NSArray : NSObject
@end 当我们使用如下方式初始化NSArray时:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片 NSArray *array = [[NSArray alloc] init]; 按照Cocoa的命名规则,语句[NSArray alloc] 的类型就是NSArray*因为alloc的返回类型属于关联返回类型。同样,[[NSArray alloc]init] 的返回结果也是NSArray*。 三、instancetype作用
、作用 如果一个不是关联返回类型的方法,如下:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片 @interface NSArray
+ (id)constructAnArray;
@end 当我们使用如下方式初始化NSArray时:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片 [NSArray constructAnArray]; 根据Cocoa的方法命名规范,得到的返回类型就和方法声明的返回类型一样,是id。 但是如果使用instancetype作为返回类型,如下:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片 @interface NSArray
+ (instancetype)constructAnArray;
@end 当使用相同方式初始化NSArray时:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片 [NSArray constructAnArray]; 得到的返回类型和方法所在类的类型相同,是NSArray*! 总结一下,instancetype的作用,就是使那些非关联返回类型的方法返回所在类的类型!
、好处 能够确定对象的类型,能够帮助编译器更好的为我们定位代码书写问题,比如:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片 [[[NSArray alloc] init] mediaPlaybackAllowsAirPlay]; // "No visible @interface for `NSArray` declares the selector `mediaPlaybackAllowsAirPlay`" [[NSArray array] mediaPlaybackAllowsAirPlay]; // (No error) 上例中第一行代码,由于[[NSArray alloc]init]的结果是NSArray*,这样编译器就能够根据返回的数据类型检测出NSArray是否实现mediaPlaybackAllowsAirPlay方法。有利于开发者在编译阶段发现错误。 第二行代码,由于array不属于关联返回类型方法,[NSArray array]返回的是id类型,编译器不知道id类型的对象是否实现了mediaPlaybackAllowsAirPlay方法,也就不能够替开发者及时发现错误。
四、instancetype和id的异同
、相同点 都可以作为方法的返回类型
、不同点 ①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象; ②instancetype只能作为返回值,不能像id那样作为参数,比如下面的写法:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片 //err,expected a type
- (void)setValue:(instancetype)value
{
//do something
} 就是错的,应该写成:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片 - (void)setValue:(id)value
{
//do something
}
(转)Objective-C中的instancetype和id区别的更多相关文章
- Objective-C中的instancetype和id区别
目录(?)[-] 有一个相同两个不同相同 Written by Mattt Thompson on Dec 10th 2012 一什么是instancetype 二关联返回类型related resu ...
- 转载:Objective-C中的 instancetype 和 id 关键字
Objective-C中的instancetype和id关键字 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/16994 ...
- Objective-C中的instancetype和id关键字(转)
转自:Objective-C中的instancetype和id关键字 一.什么是instancetype 同id一样,都是表示未知类型的的对象. 二.关联返回类型(related result typ ...
- 【转】Objective-C中的instancetype和id关键字
原文:http://blog.csdn.net/wzzvictory/article/details/16994913 一.什么是instancetype instancetype是clang 3.5 ...
- Objective-C中的instancetype与id的区别
一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以 ...
- Objective-C中的instancetype和id…
作者:韩俊强 原文地址:http://control.blog.sina.com.cn/admin/article/article_add.php 转载请注明出处 一.什么是instancetype ...
- CSS中的class与id区别及用法
转自http://www.divcss5.com/rumen/r3.shtml及http://www.jb51.net/css/35927.html 我们平常在用DIV CSS制作Xhtml网页页面时 ...
- Objective C中nil/Nil/NULL的区别
nil:指向oc中对象的空指针 Nil:指向oc中类的空指针 NULL:指向其他类型的空指针,如一个c类型的内存指针 NSNull:在集合对象中,表示空值的对象 若obj为nil:[obj messa ...
- ios instancetype与id区别
我们都知道未知类型的的对象可以用id关键字表示,那为什么还会再有一个instancetype呢? instancetype能返回相关联的类型(使那些非关联返回类型的方法返回所在类的类型):而id 返回 ...
随机推荐
- json.net json转换神器
json.nethttps://json.codeplex.com/ api documenthttp://james.newtonking.com/json/help/index.html#
- Scala IDE for Eclipse的下载、安装和WordCount的初步使用(本地模式和集群模式)
包括: Scala IDE for Eclipse的下载 Scala IDE for Eclipse的安装 本地模式或集群模式 我们知道,对于开发而言,IDE是有很多个选择的版本.如我们大部分人经常 ...
- 怎样做出通用的pos小票打印程序
POS小票打印机分为热敏和针式俩种. 打印纸的宽度分为58毫米.76毫米和80毫米三种. 打印接口分为:串口.并口.USB和网口(以太网). 热敏打印机速度较快,打印的时候噪音少,针打可以使用多联纸自 ...
- 视频播放(iOS开发)
视频播放 一.视频播放介绍(5种实现方案) AVPlayer 优点 可以自定义UI,进行控制 缺点 单纯的播放,没有控制UI,而且如果要显示播放界面,需要借助AVPlayerLayer,添加图层到需要 ...
- 字符串匹配之KMP算法
KMP算法使用前缀函数来模拟有限自动机的后缀函数,前缀函数通过计算模式与其自身的偏移匹配的信息,本身的证明很复杂,关键在于弄懂其核心思想,下面就不赘述了,仅仅贴出代码: #include <io ...
- Java 动态生成 复杂 .doc文件
阅读目录 1.word 里面调整好排版,包括你想生成的动态部分,还有一些不用生成的规则性的文字 2. 将 word 文档保存为 xml 3.用 Firstobject free XML edito 打 ...
- JAVA自动生成正则表达式工具类
经过很久的努力,终于完成了JAVA自动生成正则表达式工具类.还记得之前需要正则,老是从网上找吗?找了想修改也不会修改.现在不用再为此烦恼了,使用此生成类轻松搞定所有正则表达式.赶快在同事面前炫一下吧. ...
- 分布式数据库中间件–(3) Cobar对简单select命令的处理过程
友情提示:非原文链接可能会影响您的阅读体验,欢迎查看原文.(http://blog.geekcome.com) 原文地址:http://blog.geekcome.com/archives/284 在 ...
- 基于XMPP协议的aSmack源码分析
在研究如何实现Pushing功能期间,收集了很多关于Pushing的资料,其中有一个androidnp开源项目用的人比较多,但是由于长时间没有什么人去维护,听说bug的几率挺多的,为了以后自己的产品稳 ...
- Amazon EC2上搭建VPN服务器
Amazon EC2 提供了一年免费试用,Micro Instance,配置是 1G 内存,共享 CPU,和每月 15G 的流量.搭一个 VPN 服务器绰绰有余了.操作系统我选的是 Amazon Li ...