iOS - instancetype
OC是一门正在迅速发展的语言,ARC,object literals ,subscripting ,blocks,Auto Synthesis,让我们看到它惊人的改变。instancetype是clang3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的OC对象。在这之前,我们知道可以用id来表示未知返回类型,那为什么要用instancetype呢?
【关联返回类型】
根据Cocoa的命名规则,满足下述规则的方法,将会返回一个方法所在类类型的对象,这些方法就被称为关联返回类型的方法。换句话说,这些方法的返回结果以方法所在的类为类型。
1.类方法中,以alloc或new开头;
2.实例方法中,以autorelease,init,retain或self开头;
如例子:
- @interface NSObject
- + (id)alloc;
- - (id)init;
- @end
- @interface NSArray : NSObject
- @end
当进行初始化时:
- NSArray *array = [[NSArray alloc] init];
按照Cocoa的命名规则,语句[NSArray alloc]的返回类型就是NSArray*,因为alloc的返回类型属于关联返回类型。同样,[[NSArray alloc]init]的返回结果也是NSArray *.
【具体作用】
如果一个不是关联返回类型的类方法,
- @interface NSArray
- + (id)constructAnArray;
- @end
当我们使用如下方式初始化NSArray时:
- [NSArray constructAnArray];
根据Cocoa的方法命名规范,得到的返回类型就和方法声明的返回类型一样,是id。
但是如果我们使用instancetype作为返回类型会怎么样呢?
- @interface NSArray
- + (instancetype)constructAnArray;
- @end
使用上述相同的方法进行初始化,得到的返回类型和方法所在类的类型相同,是NSArray*。
所以,综上,instancetype的作用,就是使那些非关联的方法返回所在类的类型。
【instancetype和id的异同】
相同点:都可以作为方法的返回类型。
不同点:
(1)instancetype可以返回方法所在类相同类型的对象,id只能返回未知类型的对象;
(2)instancetype只能作为返回值,不能像id一样作为参数;
[注意]: 对于init方法,id和instancetype是没有区别的。因为编译器会把id优化为instancetype。当明确返回的类型就是当前类时,使用instancetype能避免id带来的编译不出的错误情况。
iOS - instancetype的更多相关文章
- iOS instancetype or id ?
The id type simply says a method will return a reference to an object. It could be any object of any ...
- ios instancetype 和 id 的异同
1.0 相同点:都可以作为方法的返回类型 2.0 不同点: a.instancetype 可以返回和方法所在类相同类型的对象 id 只能返回未知类型的对象 b. instancetype 只能作为 ...
- IOS instancetype的使用好处
instancetype的类型表示上,跟id一样,可以表示任何对象类型 instancetype只能用在返回值类型上,不能像 id 一样用在参数类型上 instancetype 比 id 多一个好处 ...
- ios instancetype与id区别
我们都知道未知类型的的对象可以用id关键字表示,那为什么还会再有一个instancetype呢? instancetype能返回相关联的类型(使那些非关联返回类型的方法返回所在类的类型):而id 返回 ...
- iOS 用instancetype代替id作返回类型有什么好处?
2014-07-07更新:苹果在iOS 8中全面使用instancetype代替id Steven Fisher:只要一个类返回自身的实例,用instancetype就有好处. @interface ...
- 【iOS开发-48】九宫格布局案例:自己主动布局、字典转模型运用、id和instancetype差别、xib反复视图运用及与nib关系
本次九宫格案例: (1)导入app.plist和各种图片素材,方便兴许开发.实际开发中,也是如此. (2)把plist中数组导入进来. --由于本案例中app.plist终于是一个数组,数组里面是字典 ...
- iOS开发中id、NSObject *、id、instancetype四者有什么区别?
在使用Objective-C语言进行iOS应用开发的时候,常常会涉及到id.NSObject *.id.instancetype这四个概念的使用,但这四者也是iOS初学者最易混淆的内容,下面小编看 ...
- iOS开发之instancetype
instancetype和id使用方法类似,但他们还有不同点: (1)instancetype在类型表示上,跟id一样,可以表示任何对象类型 (2)instancetype只能用在返回值类型上,不能像 ...
- iOS边练边学--plist文件,懒加载,模型初使用--补充instancetype
一.什么是plist文件 1>将数据直接写在代码里面,不是一种合理的做法.如果数据经常修改,就要经常翻开对应的代码进行修改,造成代码扩展性低 2>因此,可以考虑将经常变得数据放在文件中进行 ...
随机推荐
- Java多线程-工具篇-BlockingQueue(转)
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...
- iOS之GCDAsyncSocket第三方库的使用
Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...
- Java项目依赖的配置过程
我们经常需要把大项目分解成多个小项目,然后使用依赖方式,将其他必须的依赖项目引用到项目中.最常用的方式是希望被依赖的项目能够自动被打包成jar文件,自动部署到依赖的项目中.同时被依赖项目修改后,能够同 ...
- sqlserver 连不上的问题
tcp ip 属性 ipall 属性改为1433
- visio篇章--1
因为要做需求规格说明书的需要,所以学着用visio.发现visio中其实有很多东西的.我昨晚是用它来画ER图.不画不知道,花了之后才发现有很多窍门在里面.不说废话.我列举一下应该要的东西 1.百度链接 ...
- 20160329javaweb之JSP -cookie入门
一.什么是会话? •会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话过程中要解决的一些问题? •每个用户在使用浏览器与服务器 ...
- 多个线程访问url
多个线程访问url package com.aig.ecompassios.ecard; import java.io.BufferedReader; import java.io.InputStre ...
- WPF-TxtBox控件利用KeyDown来控制键盘输入
private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { TextBox txt = ...
- HOOK函数(二)——全局HOOK
如果钩子函数定义于当前进程相关的线程中,则钩子函数只能处理当前进程的线程的消息,如果要想处理当前正在运行的所有进程的鼠标消息和键盘消息,那么安装钩子函数的代码必须实现在动态链接库中.所以如果想让安装的 ...
- ios 消息跳转处理
一.消息转发流程 当向Objective-C对象发送一个消息,但runtime在当前类及父类中找不到此selector对应的方法时,消息转发(message forwarding)流程开始启动. 动态 ...