id是什么意思?
我(试图)学习Objective-C,并不断遇到一个短语,如:
-(id) init;
我知道id
是一个Objective C语言关键字,但是说“编译器专门用指针types转换规则处理id
”是什么意思呢?
id
是否自动指定对象作为指针?
id
是一个指向任何types的指针,但不像void *
它总是指向一个Objective-C对象。 例如,您可以将任何types的id
添加到NSArray,但这些对象必须响应retain
和release
。
编译器非常高兴能够将任何对象隐式转换为id
,并将id
为任何对象。 这与Objective-C中的其他隐式转换不同,并且是cocoa中大多数容器types的基础。
id
是指向任何Objective-C对象( objc_object
)的指针。 这不仅仅是一个无效的指针,你不应该这样对待它。 它引用了一个应该有一个有效的isa
指针的对象。 可以存储在id
中的值也不仅仅局限于NSObject
及其后代,它开始理解NSObject
协议的存在以及NSProxy
类,它甚至不会从NSObject
inheritance。 编译器将允许你将一个由id
types引用的对象分配给任何对象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;