id ,NSObject和id<object>的区别

转载 2015年07月10日 10:54:52
    我们经常会混淆以下三种申明(我是没有留意过):
    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>告诉编译器,你不关心对象是什么类型,但它必须遵守NSObject协议(protocol),编译器就能保证所有赋值给id<NSObject>类型的对象都遵守NSObject协议(protocol)。这样的指针可以指向任何NSObject对象,因为NSObject对象遵守NSObject协议(protocol),而且,它也可以用来保存NSProxy对象,因为它也遵守NSObject协议(protocol)。这是非常强大,方便且灵活,你不用关心对象是什么类型,而只关心它实现了哪些方法。

    现在你知道你要用什么类型了不?

    如果你不需要任何的类型检查,使用id,它经常作为返回类型,也经常用于申明代理(delegate)类型。因为代理类型通常在运行时,才会检查是否实现了那些方法。

    如果真的需要编译器检查,那你就考虑使用第2种或者第3种。很少看到NSObject*能正常运行,但id<NSObject>无法正常运行的。使用协议(protocol)的优点是,它能指向NSProxy对象,而更常用的情况是,你只想知道某个对象遵守了哪个协议,而不用关心它是什么类型。

Objective-C 中的id到底是什么

今天我就要来看清楚,id,你到底是个什么东西?
  • u013230511
  • u013230511
  • 2015年01月08日 08:22
  • 1285

iOS: 把对象直接转化成NSDictionary或JSON

目录 1. 使用2. 实现3. 下载和代码   返回目录  1. 使用 实现的结果就是可以把任何对象转化成字典或者字典对应的JSON。字典的数据就是来自对象的属性名称和属性值 。...
  • leikezhu1981
  • leikezhu1981
  • 2014年10月12日 15:30
  • 25836

Android中@+id和@id的区别

Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值。id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc、@+id/xyz等。  如果在@后...
  • u012230055
  • u012230055
  • 2014年12月18日 09:57
  • 1596

id 与NSObject的区别

1、          id关键字在编译时不会被检查,而NSObject在编译时会被检查。 2、          id可以是任何对象,也包括非NSObjiect对象。 3、          然...
  • ningshuang520
  • ningshuang520
  • 2014年10月13日 11:05
  • 703

Object-c之id ,instancetype,SEL,_cmd;self,super几种类型的区别及用法

一 id 和instancetype相同点: instanceType和id都是作为方法的返回类型而被使用。 不同点: 1.instancetype可以返回和方法所在类相同类型的对象,id返回的...
  • BaiHuaXiu123
  • BaiHuaXiu123
  • 2015年11月18日 16:12
  • 786

super init重构 id 指针 NSObject指针 intancetype指针

OC基础day06 **问题 : init初始化初始化默认值 和 类初初始化的区别 调用时 子类父类类方法是必须要用父类的类方法名 才能调用 ...
  • lidian6864677
  • lidian6864677
  • 2016年08月22日 20:06
  • 229

id ,NSObject, id<NSObject>区别

我们经常会混淆以下三种申明(我是没有留意过):     1. id foo1;     2. NSObject *foo2;     3. id foo3;     第一种是最常用的,它简...
  • u013531259
  • u013531259
  • 2014年01月29日 10:08
  • 979

iOS学习之id ,NSObject, id<NSObject>区别

我们经常会混淆以下三种申明(我是没有留意过): 1. id foo1; 2. NSObject *foo2; 3. id foo3;第一种是最常用的,它简单地申明了指向对...
  • king457757706
  • king457757706
  • 2017年03月13日 16:39
  • 94

IOS_OC_id ,NSObject, id<NSObject>区别

我们经常会混淆以下三种申明(我是没有留意过):     1. id foo1;     2. NSObject *foo2;     3. id foo3;     第一种是最常用的,它简...
  • strawberry2013
  • strawberry2013
  • 2014年11月20日 20:19
  • 1818

黑马程序员07--Object-C--05--id、构造方法、类的深入研究、description、SEL

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、id 万能指针,能指向/操作任何OC对象,id本身包含*,使用时切记不要多余加上*。 二、...
  • u010037134
  • u010037134
  • 2014年12月17日 18:50
  • 177
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:id ,NSObject和id<object>的区别
举报原因:
原因补充:

(最多只允许输入30个字)