Answers:
id是指向任何类型的指针,但与void *它不同的是,它始终指向Objective-C对象。例如,您可以将任何类型的内容添加id到NSArray,但是这些对象必须响应retain和release。
编译器非常高兴您可以将任何对象隐式转换为id,也可以将您强制转换id为任何对象。这不同于Objective-C中的任何其他隐式转换,并且是Cocoa中大多数容器类型的基础。
id 的定义是typedef struct objc_object *id;,因此它指向Objc对象。
NSObject吗?意思是,我可以id用NSObject返回类型替换吗?
id是泛型类型。这意味着编译器将在那里期望任何 对象类型,并且不会强制执行限制。如果您期望在那里使用不止一类对象,则该功能很有用。然后,您可以使用自省功能找出它是哪个类。id自动假定一个指针,因为Objective-C中的所有对象都作为指针/引用传递。
一些其他资源:
id vs NSObject vs id *
Objective-C编程(Wikibooks)
内省
动态键入
是的,没有。确实,id x将x指定为指针,但是说适用指针类型转换规则是错误的,因为“ id”具有特殊的类型转换规则。例如,使用void *指针不能执行以下操作:
void *x;
char *y = x; // error, this needs an explicit cast
相反,可以使用id:
id x;
NSString *y = x;
另外,在“现代” Objective C中,首选instancetype在“ init”方法上使用而不是“ id”。Xcode中甚至有一个自动转换工具来更改它。阅读有关instancetype的信息:开始使用instancetype而不是id是否有益?
void*