我正在(尝试)学习 Objective-C,但我不断遇到这样的短语:
-(id) init;
而且我理解 id
是一个Objective C语言关键字,但是说“编译器根据指针类型转换规则专门处理id
”是什么意思?
id
是否自动将其右侧的对象指定为指针?
id
是指向任何类型的指针,但与 void *
不同的是,它始终指向 Objective-C 对象。例如,您可以将 id
类型的任何内容添加到 NSArray,但这些对象必须响应 retain
和 release
。
编译器非常乐意将任何对象隐式转换为 id
,并将 id
转换为任何对象。这与 Objective-C 中的任何其他隐式转换不同,并且是 Cocoa 中大多数容器类型的基础。
id
是指向任何 Objective-C 对象 (objc_object
) 的指针。它不仅仅是一个空指针,你不应该这样对待它。它引用了一个应该具有有效 isa
指针的对象。 id
中可以存储的值也不仅限于 NSObject
及其后代,这开始理解 NSObject
协议以及甚至不继承的 NSProxy
类的存在从NSObject
。编译器将允许您将类型 id
引用的对象分配给任何对象类型,将任何对象类型分配给 id
,以及向其发送任何消息(编译器已经看到)而不发出警告。
id
是通用类型。这意味着编译器会期望 any object 类型在那里,并且不会强制执行限制。如果您希望在那里使用多于一类的对象,它会很有用;然后,您可以使用自省来找出它是哪个类。 id
自动假定一个指针,因为 Objective-C 中的所有对象都作为指针/引用传递。
一些其他资源:
id vs NSObject vs id*
Objective-C Programming (Wikibooks)
Introspection
Dynamic Typing
id 是 Objective-C 中对象标识符的一种数据类型,它可以用于任何类型的对象,无论它有什么类。 id 是所有对象的最终超类型。
在java或c#中,我们这样使用
Object data = someValue;
String name =(Object)data;
但在目标 c
id data= someValue;
NSString *name= data;
是和不是。确实有 id x
将 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 的更多用法。
此外,在“现代”Objective C 中,“init”方法更倾向于使用 instancetype
而不是“id”。 Xcode 中甚至有一个自动转换工具来改变它。阅读实例类型:Would it be beneficial to begin using instancetype instead of id?
id
的定义是typedef struct objc_object *id;
,所以它指向一个Objc
对象。NSObject
一样吗?意思是,当它是返回类型时,我可以用NSObject
替换id
吗?