【问题标题】:What is the meaning of id?身份证是什么意思?
【发布时间】:2011-11-02 20:43:06
【问题描述】:

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

-(id) init;

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

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

【问题讨论】:

标签: objective-c types


【解决方案1】:

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。)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 第一个博客链接现已失效,但可以在archive.org 找到,最后两个链接现在似乎重定向到一个可疑的站点,请将它们替换为archive.org 链接:@987654326 @, Dynamic Typing
    • 最后两个链接指向我的旧博客……我曾经拥有它的域? 刚刚更新了指向他们当前 Wordpress 子域的链接
    • 感谢您的更新,您也可以编辑第一个链接吗?它还是死了。我猜一个archive.org 链接总比没有好。
    【解决方案4】:
    • id是Objective-C中对象标识符的一种数据类型,可以 可用于任何类型的对象,无论它有什么类。 id 是所有对象的最终超类型。

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

     Object data = someValue;
    
    
     String name =(Object)data;
    

    但在目标 c

    id data= someValue;
    
    
    
    NSString *name= data;
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-12
        • 1970-01-01
        • 1970-01-01
        • 2019-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-20
        相关资源
        最近更新 更多