一、什么是instancetype

instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象。我们都知道未知类型的的对象可以用id关键字表示,那为什么还会再有一个instancetype呢?

二、关联返回类型(related result types)

根据Cocoa的命名规则,满足下述规则的方法:

1、类方法中,以alloc或new开头

2、实例方法中,以autorelease,init,retain或self开头

会返回一个方法所在类类型的对象,这些方法就被称为是关联返回类型的方法。换句话说,这些方法的返回结果以方法所在的类为类型,说的有点绕口,请看下面的例子:

[objc] view plaincopy
  1. @interface NSObject
  2. + (id)alloc;
  3. - (id)init;
  4. @end
  5. @interface NSArray : NSObject
  6. @end
当我们使用如下方式初始化NSArray时:
[objc] view plaincopy
  1. NSArray *array = [[NSArray alloc] init];
按照Cocoa的命名规则,语句[NSArray alloc] 的类型就是NSArray*因为alloc的返回类型属于关联返回类型。同样,[[NSArray alloc]init] 的返回结果也是NSArray*。

三、instancetype作用

1、作用

如果一个不是关联返回类型的方法,如下:

[objc] view plaincopy
  1. @interface NSArray
  2. + (id)constructAnArray;
  3. @end

当我们使用如下方式初始化NSArray时:

[objc] view plaincopy
  1. [NSArray constructAnArray];
根据Cocoa的方法命名规范,得到的返回类型就和方法声明的返回类型一样,是id。

但是如果使用instancetype作为返回类型,如下:

[objc] view plaincopy
  1. @interface NSArray
  2. + (instancetype)constructAnArray;
  3. @end
当使用相同方式初始化NSArray时:
[objc] view plaincopy
  1. [NSArray constructAnArray];
得到的返回类型和方法所在类的类型相同,是NSArray*!

总结一下,instancetype的作用,就是使那些非关联返回类型的方法返回所在类的类型!

2、好处

能够确定对象的类型,能够帮助编译器更好的为我们定位代码书写问题,比如:

[objc] view plaincopy
  1. [[[NSArray alloc] init] mediaPlaybackAllowsAirPlay]; //  "No visible @interface for `NSArray` declares the selector `mediaPlaybackAllowsAirPlay`"
  2. [[NSArray array] mediaPlaybackAllowsAirPlay]; // (No error)
上例中第一行代码,由于[[NSArray alloc]init]的结果是NSArray*,这样编译器就能够根据返回的数据类型检测出NSArray是否实现mediaPlaybackAllowsAirPlay方法。有利于开发者在编译阶段发现错误。

第二行代码,由于array不属于关联返回类型方法,[NSArray array]返回的是id类型,编译器不知道id类型的对象是否实现了mediaPlaybackAllowsAirPlay方法,也就不能够替开发者及时发现错误。

四、instancetype和id的异同

1、相同点

都可以作为方法的返回类型

2、不同点

①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;

②instancetype只能作为返回值,不能像id那样作为参数,比如下面的写法:

[objc] view plaincopy
  1. //err,expected a type
  2. - (void)setValue:(instancetype)value
  3. {
  4. //do something
  5. }
就是错的,应该写成:
[objc] view plaincopy
  1. - (void)setValue:(id)value
  2. {
  3. //do something
  4. }

转载于:https://www.cnblogs.com/zuozeing/p/3616782.html

instancetype和id的区别相关推荐

  1. 关于instancetype代替id的使用区别

    使用instancetype有三点好处: 1.明确性.代码只做你让它做的事,而不是其他. 2.程式化.你会养成好习惯,这些习惯在某些时候会很有用,而且肯定有用武之地. 3.一致性.让代码可读性更好. ...

  2. (转)Objective-C中的instancetype和id区别

    有一个相同两个不同.相同 Written by Mattt Thompson on Dec 10th, 2012Objective-C is a rapidly evolving language, ...

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

    有一个相同两个不同.相同 Written by Mattt Thompson on Dec 10th, 2012 Objective-C is a rapidly evolving language, ...

  4. Android @id和@+id 以及 @android:id 的区别

    昨天突然有新来的同事问我这个@id 和@+id 的区别 ,为什么 我们的项目都是@id 自己新增的ui 使用的@+id 这里说下我的简单的回复项目是维护的之前的是为了统一管理使用了@id  方便修改 ...

  5. 转载:Objective-C中的 instancetype 和 id 关键字

    Objective-C中的instancetype和id关键字 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/16994 ...

  6. JS中class和id的区别

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

  7. android @id和@+id的区别

    今天,简单讲讲android里关于@id和@+id的区别. 之前,自己在布局里无论什么情况都使用@+id,可是后来发现有些代码用的是@id,自己不知道这两者之间有什么区别.于是就在网上查找资料,最终是 ...

  8. Objective-C中的instancetype和id关键字

    作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/16994913 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关 ...

  9. instancetype 与 id for Objective-C

    instancetype vs id for Objective-C 新的LLVM编译器为我们带来了ARC, Object Literal and Scripting, Auto Synthesis等 ...

最新文章

  1. 科研超级神器,摘要页一键链接关联论文
  2. Cell Research:华农解析水虻基因组图谱和肠道微生物组降解规律
  3. python扫描proxy并获取可用代理ip列表
  4. edge浏览器如何把网页放到桌面_最强桌面浏览器
  5. linux 自动安装mysql数据库_Linux安装MySql数据库
  6. jQuery的preventDefault()
  7. 字符设备驱动高级篇4——设备类(自动创建和删除设备文件)相关代码分析
  8. tsd3dmapper软件使用方法_TOYO模组选型软件使用方法
  9. 阿里登顶毕马威全球企业创新榜 AliOS引领智能网联汽车产业发展
  10. 初探队与广度优先搜索
  11. c语言静态数组是什么意思,C语言静态数组实现栈操作
  12. 电商产品设计:后台商品管理设计
  13. php bin2hex park,PHP bin2hex()函数与示例
  14. 怎么修改PDF文件中的图片以及文字
  15. linux 卸载theano,centos 安装theano
  16. webpack-theme-color-replacer 路由跳转之后,样式丢失
  17. Flutter时间轴
  18. matlab 神经网络train均方误差,MATLAB搭建bp神经网络的误差特别大,但R2的值也大,求解帮我看看我的网络哪里出问题了...
  19. Python + Selenium实现163邮箱的自动登录和发送邮件
  20. linux下执行gauss的脚本文件,求脚本:同时向n个nodes提交并执行当前目录下所有Gaussian输入文件...

热门文章

  1. c++ :MFC opencv使用namedWindow,imshow出现两个窗口
  2. 有三AI一周年了,说说我们的初衷,生态和愿景
  3. 跨界巨头谋定现代农业-农民丰收节交易会:全产业链布局
  4. 谋定菲律宾农业全产业链建设 对话国际农民丰收节贸易会
  5. Spring Boot使用Redis进行消息的发布订阅
  6. sql server创建新用户名登录以及为表添加角色和权限的多种方法
  7. 关于Server Tomcat v8.0 Server at localhost failed to start的解决办法
  8. OpenCV学习:播放avi视频文件
  9. Atitit. . 软件命名空间与类名命名单词的统计程序设计v2
  10. 我们为什么要把方法区分为:静态方法和实例化方法 ?(摘)