ChatGPT解决这个技术问题 Extra ChatGPT

身份证是什么意思?

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

-(id) init;

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

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

这是自我的反面。对于某些void*的人
以下是与该问题相关的讨论:SO question
也许您来这里是因为nobody told you about iD

j
joerick

id 是指向任何类型的指针,但与 void * 不同的是,它始终指向 Objective-C 对象。例如,您可以将 id 类型的任何内容添加到 NSArray,但这些对象必须响应 retainrelease

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


补充:id 的定义是 typedef struct objc_object *id; ,所以它指向一个 Objc 对象。
NSObject一样吗?意思是,当它是返回类型时,我可以用 NSObject 替换 id 吗?
@ThunderWiring - 一个准确的答案是否定的,因为您可以将 NSProxy 分配给类型为 id 的变量。 (NSProxy 不来自 NSObject。)
J
Joe

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


F
FeifanZ

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

一些其他资源:
id vs NSObject vs id*
Objective-C Programming (Wikibooks)
Introspection
Dynamic Typing


第一个博客链接现已失效,但可以在 archive.org 找到,最后两个链接现在似乎重定向到一个可疑的站点,请将它们替换为 archive.org 链接:IntrospectionDynamic Typing
最后两个链接指向我的旧博客……我曾经拥有它的域😅 刚刚更新了指向他们当前 Wordpress 子域的链接
感谢您的更新,您也可以编辑第一个链接吗?它还是死了。我猜一个archive.org 链接总比没有好。
c
chancyWu

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

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

 Object data = someValue;


 String name =(Object)data;

但在目标 c

id data= someValue;



NSString *name= data;

C
Community

是和不是。确实有 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?