id是什么意思?

时间:2011-11-02 20:43:06

标签: objective-c types

我(正在尝试)学习Objective-C,我不断遇到一句话:

-(id) init;

我理解id是一个Objective C语言关键字,但是说“编译器根据指针类型转换规则专门处理id是什么意思”?

id是否自动将对象指向其右侧作为指针?

5 个答案:

答案 0 :(得分:100)

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

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

答案 1 :(得分:28)

id是指向任何Objective-C对象(objc_object)的指针。它不仅仅是一个无效指针,你不应该这样对待它。它引用了一个应该具有有效isa指针的对象。可以存储在id中的值也不仅限于NSObject及其后代,它们开始理解NSObject协议的存在以及{{3甚至不从NSObject继承的类。编译器允许您将类型id引用的对象分配给任何对象类型,将任何对象类型分配给id,并在不发出警告的情况下向其发送任何消息(编译器已看到)。

答案 2 :(得分:22)

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

其他一些资源:
id vs NSObject vs id*
Objective-C Programming (Wikibooks)
Introspection
Dynamic Typing

答案 3 :(得分:7)

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

在java或c#中我们这样使用

 Object data = someValue;


 String name =(Object)data;

但在目标c

id data= someValue;



NSString *name= data;

答案 4 :(得分:5)

是和否。将id x指定为指针,但指出指针类型转换规则适用是错误的,因为" id"有特殊的类型转换规则。例如,使用void *指针,您无法执行此操作:

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

相反,可以使用id:

id x;
NSString *y = x;

查看id in objective c examples类型的更多用法。

另外在"现代"目标C首选使用instancetype代替" id" on" init"方法。甚至在Xcode中也有一个自动转换工具来改变它。 阅读有关instancetype:Would it be beneficial to begin using instancetype instead of id?

的信息