IOS_OC_id ,NSObject, id<NSObject>差别
我们常常会混淆下面三种申明(我是没有留意过):
1. id foo1;
2. NSObject *foo2;
3. id<NSObject> foo3;
第一种是最经常使用的,它简单地申明了指向对象的指针,没有给编译器不论什么类型信息,因此,编译器不会做类型检查。但也由于是这样,你能够发送不论什么信息给id类型的对象。这就是为什么+alloc返回id类型,但调用[[Foo alloc] init]不会产生编译错误。
因此,id类型是执行时的动态类型,编译器无法知道它的真实类型,即使你发送一个id类型没有的方法,也不会产生编译警告。
我们知道,id类型是一个Objective-C对象,但并非都指向继承自NSOjbect的对象,即使这个类型和NSObject对象有非常多共同的方法,像retain和release。要让编译器知道这个类继承自NSObject,一种解决的方法就是像第2种那样,使用NSObject静态类型,当你发送NSObject没有的方法,像length或者count时,编译器就会给出警告。这也意味着,你能够安全地使用像retain,release,description这些方法。
因此,申明一个通用的NSObject对象指针和你在其他语言里做的类似,像java,但其他语言有一定的限制,没有像Objective-C这样灵活。并非全部的Foundation/Cocoa对象都继承息NSObject,比方NSProxy就不从NSObject继承,所以你无法使用NSObject*指向这个对象,即使NSProxy对象有release和retain这种通用方法。为了解决问题,这时候,你就须要一个指向拥有NSObject方法对象的指针,这就是第3种申明的使用情景。
id告诉编译器,你不关心对象是什么类型,但它必须遵守NSObject协议(protocol),编译器就能保证全部赋值给id类型的对象都遵守NSObject协议(protocol)。这种指针能够指向不论什么NSObject对象,由于NSObject对象遵守NSObject协议(protocol),并且,它也能够用来保存NSProxy对象,由于它也遵守NSObject协议(protocol)。这是很强大,方便且灵活,你不用关心对象是什么类型,而仅仅关心它实现了哪些方法。
如今你知道你要用什么类型了不?
假设你不须要不论什么的类型检查,使用id,它常常作为返回类型,也常常常使用于申明代理(delegate)类型。由于代理类型通常在执行时,才会检查是否实现了那些方法。
假设真的须要编译器检查,那你就考虑使用第2种或者第3种。非常少看到NSObject*能正常执行,但id无法正常执行的。使用协议(protocol)的长处是,它能指向NSProxy对象,而更经常使用的情况是,你仅仅想知道某个对象遵守了哪个协议,而不用关心它是什么类型。
IOS_OC_id ,NSObject, id<NSObject>差别的更多相关文章
- instancetype、id、NSObject的联系和区别
1.id和instancetype都能省去具体类型,提高代码的通用性.而NSObject *则没有这种功能. 2.instancetype只能用于方法的返回类型,而id用处和NSObject *类似. ...
- iOS开发中id、NSObject *、id、instancetype四者有什么区别?
在使用Objective-C语言进行iOS应用开发的时候,常常会涉及到id.NSObject *.id.instancetype这四个概念的使用,但这四者也是iOS初学者最易混淆的内容,下面小编看 ...
- id ,NSObject, id<NSObject>区别
转自:http://blog.csdn.net/happytengfei/article/details/11473931 我们经常会混淆以下三种申明(我是没有留意过): 1. id foo1; ...
- id、NSObject *、id<NSObject>、instancetype
1. id 与 NSObject * (1) id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的 ...
- NSObject class和NSObject protocol的关系(抽象基类与协议)
[转载请注明出处] 1.接口的实现 对于接口这一概念的支持,不同语言的实现形式不同.Java中,由于不支持多重继承,因此提供了一个Interface关键词.而在C++中,通常是通过定义抽象基类的方式来 ...
- id和NSObject *和instanceType的区别与联系
id 被成为万能指针,也就是可以指向任何对象. NSObject * 本身就是定义指向NSObject类型的指针. 那么这两者有什么区别吗? 这两者都是既可以作为返回值,又可以作为变量修饰.而其主要区 ...
- ExtJs4学习(四):Extjs 中id与itemId的差别
为了方便表示或是指定一个组件的名称,我们一般会使用id或者itemId进行标识命名. (推荐尽量使用itemId.这样能够降低页面唯一标识而产生的冲突) id: id是作为整个页面的Comp ...
- NSObject头文件解析 / 消息机制 / Runtime解读 (一)
NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import <Foundation/Foundation.h> @interface Clas ...
- YYModel 源码解读(二)之NSObject+YYModel.h (4)
接下来我们继续向下看 typedef struct { void *modelMeta; ///< _YYModelMeta void *model; ///< id (self) voi ...
随机推荐
- [非技术参考]C#重写ToString方法
C# 中的每个类或结构都隐式继承 Object 类. 因此,C# 中的每个对象都会获得 ToString 方法,此方法返回该对象的字符串表示形式. 例如,所有 int 类型的变量都有一个 ToStri ...
- javascript --推箱子
<head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" ...
- codeforces 242E. XOR on Segment 线段树
题目链接 给n个数, 两种操作, 一种是求区间内的数的和, 一种是将区间内的数异或x. 异或x没有什么思路, 单个异或肯定超时, 区间异或也没有办法做....后来才知道可以按位建线段树, 这样建20棵 ...
- 新浪sae 项目之 git 配置
新浪sae 项目现在支持git 配置了,但是有好多人配置不成功.下面对这个问题进行一个总结. 1. 在新浪云上面新建项目(该步骤省略) 2. 一般新建完毕后,会让你选择代码的管理工具,如下 注意这里, ...
- win10中的vmware桥接模式异常,不能设置同网段ip
今天发现centOS的桥接模式不正常了,配置 dhclient居然不成功,没有同个网段的ip,于是各种找原因. 突然灵光一现,前几天更新了win10,会不会神马驱动或者服务没安装? 找了一圈,我勒个去 ...
- MySQL zerofill 的用法
creata table t(x int(6) zerofill,y int); insert into t(x,y) values(1,1); select x,y from t;
- safari的调试工具
safari的调试工具默认是没有打开的设置——>偏好设置——>高级———>在菜单栏中显示开发菜单
- qwtplot3D安装——终结解决方案(YOUYOU版)
转自CSDN: 首先不得不说,要感谢北京邮电大学的阿科.感谢他慷慨的分享和极具科学态度的记录,将自己搜集到的众多资料收集整理发布,拯救众多苦逼寻找方案的程序员于苦海之中.因为最近接手新的项目,涉及到使 ...
- HDFS 2中Namenode启动时WebUI的变化
在HDFS1中NameNode启动顺序是这样的: 1. 读取Fsimage文件 2. 读取edit logs文件,逐行执行里面的操作 3. 写checkpoint,生成新的Fsimage(老的Fs ...
- 使用LAMP创建基于wordpress的个从博客站点
參考: http://blog.csdn.net/ck_boss/article/details/27866117 一.mysql配置 1.安装mysql yum install mysql-serv ...