id是什么意思?

我(试图)学习Objective-C,并不断遇到一个短语,如:

-(id) init; 

我知道id是一个Objective C语言关键字,但是说“编译器专门用指针types转换规则处理id ”是什么意思呢?

id是否自动指定对象作为指针?

id是一个指向任何types的指针,但不像void *它总是指向一个Objective-C对象。 例如,您可以将任何types的id添加到NSArray,但这些对象必须响应retainrelease

编译器非常高兴能够将任何对象隐式转换为id ,并将id为任何对象。 这与Objective-C中的其他隐式转换不同,并且是cocoa中大多数容器types的基础。

id是指向任何Objective-C对象( objc_object )的指针。 这不仅仅是一个无效的指针,你不应该这样对待它。 它引用了一个应该有一个有效的isa指针的对象。 可以存储在id中的值也不仅仅局限于NSObject及其后代,它开始理解NSObject协议的存在以及NSProxy类,它甚至不会从NSObjectinheritance。 编译器将允许你将一个由idtypes引用的对象分配给任何对象types,将任何对象types赋值给id ,并且发送任何消息(编译器见过的)而不发出任何警告。

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

一些其他资源:
id vs NSObject vs id *
Objective-C编程(维基教科书)
内省
dynamic打字

是和不是。 确实有id x指定x作为指针,但说指针types转换规则适用是错误的,因为“id”有特殊的types转换规则。 例如,一个void *指针,你不能这样做:

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

相反,它可能与id:

 id x; NSString *y = x; 

在目标c示例中查看typesid的更多用法。

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

  • “id”是Objective-C中对象标识符的一种数据types,可以用于任何types的对象,不pipe它有什么类。 “id”是所有对象的最终超types。

在Java或C#我们使用这样的

  Object data = someValue; String name =(Object)data; 

但在目标c

 id data= someValue; NSString *name= data;