在使用Objective-C语言进行iOS应用开发的时候,常常会涉及到id、NSObject *、id、instancetype这四个概念的使用,但这四者也是iOS初学者最易混淆的内容,下面小编看了一些iOS开发教程和文档,搜罗了他们的不同用法,分享给大家,一起来看看吧。

1. id与NSObject *

(1)id是Objective-C对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的,比如NSProxy。同时,id与NSObject对象之间有很多的共同方法,比如retain与release等方法。更一步来说:所有的对象本质来说都是id类型的。

(2)对于id来说,你可以调用任意可见的selector,编译器和IDE,不会进行类型检查,这个时候就需要你自己进行类型检查并且进行类型转换,来确保这些调用不会出错。而对于NSObject *类型,只能调用NSObject对象所声明的selector,不能调用它子类的selector,编译器会进行检查。

(3)对于一些不想或者不能进行类型检查的地方,可以使用id。比如在集合(array, collection)类型中,比如在一些你并不知道方法的返回类型的地方(比如alloc),比如我们经常声明delegate为id类型,在运行的时候再使用respondToSelector:来进行检查。

2.id

使用id来声明一个对象,相当于告诉编译我们并不知道这个对象的类型,但是它实现NSObject protocol。一个这种类型的指针,即可以用来指向NSObject*对象,也可以用来指向NSProxy*对象,因为NSObject对象与NSProxy对象都是现了NSObject protocol。

3. id与instancetype

在instancetype有效的情况下,应该尽量去使用instancetype。至于什么是合适的时候,可以参考stack overflow上面所说:“Use instancetype whenever it's appropriate, which is whenever a

class returns an instance of that same class.”,

Apple官方文档:

In your code,replace occurrences of id as a return value with instancetype whereappropriate. This is typically the case for init methods and class factorymethods. Even though the compiler automatically converts methods that beginwith “alloc,” “init,” or “new” and have a return type of id to returninstancetype, it doesn’t convert other methods. Objective-C convention is towrite instancetype explicitly for all methods.

通过上面的介绍,希望对大家以后使用id、NSObject *、id、instancetype有所帮助吧。

相关文章:《Objective-C 开发语言函数编写小技巧

文/小麦麦子(简书作者)
原文链接:http://www.jianshu.com/p/92910741d0d5
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

最新文章

  1. js入门学习~ 运动应用小例
  2. AppFog免费云空间申请及安装wordpress(图文教程)
  3. Android_AsyncTask异步任务机制
  4. JavaScript高级程序设计学习笔记--函数表达式
  5. Effective C# 学习笔记(原则二:为你的常量选择readonly而不是const)
  6. 关于跨域响应头Access-Control-Allow-Headers的一些说明
  7. WCF入门(七)---自托管消费WCF服务
  8. windows共享文件夹如何让CentOS 6.5读取
  9. Linux命令之切换用户
  10. NodeJs md5 sha1加密
  11. 微信js-sdk分享详解及demo实例
  12. 接口测试入门(3)--使用httpClient进行登录用例操作/set-cookies验证/ List<NameValuePair>设置post参数/json解析
  13. Linux修改hostname的几种方法
  14. Material Theme 文件名的标签(tab)被大写了
  15. 解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创)
  16. python中$和@基础笔记
  17. 用python完成带有进度条的圆周率计算
  18. React-使用styled-components
  19. B树,B+树,红黑树应用场景AVL树,红黑树,B树,B+树,Trie树
  20. Oracle数据库order by排序查询分页比不分页还慢问题解决办法

热门文章

  1. windows 下查看端口占用情况
  2. 详解CorelDRAW中如何合并与拆分对象
  3. R语言概述
  4. 一句话木马:ASP篇
  5. Kubernetes 集群:规划与搭建
  6. 解决16bit压缩贴图失真问题
  7. 数字图像处理笔记与体会(一)——matlab编程基础
  8. flask文件上传
  9. 51单片机的idata,xdata,pdata,data的详解(转)
  10. Java类文件结构