我(正在尝试)学习Objective-C,我不断遇到一句话:
-(id) init;
我理解id
是一个Objective C语言关键字,但是说“编译器根据指针类型转换规则专门处理id
是什么意思”?
id
是否自动将对象指向其右侧作为指针?
答案 0 :(得分:100)
id
是指向任何类型的指针,但与void *
不同,它始终指向Objective-C对象。例如,您可以向NSArray添加id
类型的任何内容,但这些对象必须回复retain
和release
。
编译器非常乐意您隐式地将任何对象强制转换为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)
在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?