id是什么意思?


97

我(正在尝试)学习Objective-C,并且不断遇到如下短语:

-(id) init;

而且我知道这id是一个Objective C语言关键字,但是说“编译器id根据指针类型转换规则专门对待”是什么意思?

是否id自动将其右边的对象指定为指针?


28
这是自我的反面。对于某些人来说void*
喜欢

以下是与该问题有关的讨论:SO问题
dmitri

Answers:


122

id是指向任何类型的指针,但与void *它不同的是,它始终指向Objective-C对象。例如,您可以将任何类型的内容添加id到NSArray,但是这些对象必须响应retainrelease

编译器非常高兴您可以将任何对象隐式转换为id,也可以将您强制转换id为任何对象。这不同于Objective-C中的任何其他隐式转换,并且是Cocoa中大多数容器类型的基础。


11
补充:id 的定义是typedef struct objc_object *id;,因此它指向Objc对象。
zhongwuzw

NSObject吗?意思是,我可以idNSObject返回类型替换吗?
ThunderWiring


33

id是指向任何Objective-C对象(objc_object)的指针。它不仅是一个空指针,而且您不应该这样对待它。它引用了应该具有有效isa指针的对象。可以存储的值id不仅限于NSObject以及其后代,这开始使该NSObject协议的存在以及NSProxy甚至不从继承的类变得有意义NSObject。编译器将允许您将按类型引用的id对象分配给任何对象类型,将任何对象类型分配给id,以及向其发送任何消息(编译器已经看到),而不会发出警告。


25

id是泛型类型。这意味着编译器将在那里期望任何 对象类型,并且不会强制执行限制。如果您期望在那里使用不止一类对象,则该功能很有用。然后,您可以使用自省功能找出它是哪个类。id自动假定一个指针,因为Objective-C中的所有对象都作为指针/引用传递。

一些其他资源:
id vs NSObject vs id *
Objective-C编程(Wikibooks)
内省
动态键入


9
  • id是Objective-C中对象标识符的数据类型,无论它具有什么类,都可以用于任何类型的对象。 id是所有对象的最终超级类型。

在Java或C#中,我们像这样使用

 Object data = someValue;


 String name =(Object)data;

但在目标c

id data= someValue;



NSString *name= data;

5

是的,没有。确实,id x将x指定为指针,但是说适用指针类型转换规则是错误的,因为“ id”具有特殊的类型转换规则。例如,使用void *指针不能执行以下操作:

void *x;
char *y = x; // error, this needs an explicit cast

相反,可以使用id:

id x;
NSString *y = x;

在目标c示例中查看更多类型id的用法

另外,在“现代” Objective C中,首选instancetype在“ init”方法上使用而不是“ id”。Xcode中甚至有一个自动转换工具来更改它。阅读有关instancetype的信息:开始使用instancetype而不是id是否有益?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.