id是什么意思?

GPP*_*GPP 88 types objective-c

我(正在尝试)学习Objective-C,我不断遇到如下的短语:

-(id) init;
Run Code Online (Sandbox Code Playgroud)

我理解的id是一个Objective C语言关键字,但是说"编译器id根据指针类型转换规则专门处理"是什么意思?

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

joe*_*ick 111

id是指向任何类型的指针,但不像void *它总是指向Objective-C对象.例如,您可以id向NSArray 添加任何类型的内容,但这些对象必须响应retainrelease.

编译器非常乐意为您隐式地转换任何对象id,并为您投射id到任何对象.这与Objective-C中的任何其他隐式转换不同,并且是Cocoa中大多数容器类型的基础.

  • 补充:`id`的定义是`typedef struct objc_object*id;`,所以它指向一个`Objc`对象. (7认同)
  • 它和 NSObject 一样吗?意思是,当它是返回类型时,我可以用“NSObject”替换“id”吗? (2认同)

Joe*_*Joe 29

id是指向任何Objective-C对象(objc_object)的指针.它不仅仅是一个无效指针,你不应该这样对待它.它引用了一个应该有一个有效isa指针的对象.可以存储的值id也不仅限于NSObject及其后代,它们开始理解NSObject协议的存在以及NSProxy甚至不继承的类NSObject.编译器允许您将类型引用的id对象分配给任何对象类型,将任何对象类型分配id给它,以及在没有警告的情况下向其发送任何消息(编译器已经看到).


Fei*_*anZ 23

id是一种通用类型.这意味着编译器将期望任何 对象类型,并且不会强制实施限制.如果您希望在那里使用多个类别的对象,它会很有用; 然后你可以使用内省来找出它是哪个类.id自动假定一个指针,因为Objective-C中的所有对象都作为指针/引用传递.

一些额外的资源:
id vs NSObject vs id*
Objective-C Programming(Wikibooks)
Introspection
Dynamic Typing

  • 第一个博客链接现已失效,但可以在 [archive.org](https://web.archive.org/web/20110724104417/http://unixjunkie.blogspot.com/2008/03/id-vs -nsobject-vs-id.html),最后两个链接现在似乎重定向到一个可疑的网站,请将它们替换为 archive.org 链接:[Introspection](https://web.archive.org/web/20120622135114 /http://cupsofcocoa.com/2011/02/13/objects-part-5-introspection/),[动态类型](https://web.archive.org/web/20120706231341/http://cupsofcocoa. com/2011/02/20/objects-part-6-dynamic-typing/) (2认同)

小智 9

  • id是Objective-C中对象标识符的数据类型,无论它具有什么类,它都可以用于任何类型的对象. id是所有对象的最终超类型.

在java或c#中我们使用这样的

 Object data = someValue;


 String name =(Object)data;
Run Code Online (Sandbox Code Playgroud)

但在目标c

id data= someValue;



NSString *name= data;
Run Code Online (Sandbox Code Playgroud)


bat*_*str 5

是的,不是.确实id x将x指定为指针,但指出指针类型转换规则适用是错误的,因为"id"具有特殊的类型转换规则.例如,使用void *指针您不能这样做:

void *x;
char *y = x; // error, this needs an explicit cast
Run Code Online (Sandbox Code Playgroud)

相反,它可能与id:

id x;
NSString *y = x;
Run Code Online (Sandbox Code Playgroud)

在Objective c示例中查看更多类型id的用法.

此外,在"现代"目标C中,首选使用instancetype"init"方法而不是"id".在Xcode中甚至还有一个自动转换工具来改变它.阅读关于instancetype:开始使用instancetype而不是id是否有益?