代码之家  ›  专栏  ›  技术社区  ›  eliego

声明变量“id”和“NSObject*”之间有什么区别?

  •  43
  • eliego  · 技术社区  · 16 年前

    在Objective-C中,声明变量和 id 而不是宣布它 NSObject * ?

    4 回复  |  直到 16 年前
        1
  •  51
  •   Chuck    16 年前

    使用类型为 id ,您可以发送任何已知消息,编译器不会抱怨。使用类型为 NSObject * ,您只能向它发送NSObject声明的消息(不是任何子类的方法),否则它将生成警告。一般来说 身份证件 这就是你想要的。

    进一步说明:所有对象本质上都是 身份证件 身份证件 NSObject*

        2
  •  18
  •   user23743 user23743    16 年前

    id 表示“对象”, NSObject * 意思是“一个 NSObject Objective-C中有一些对象不是 NSProxy , Protocol Class respondsToSelector: 身份证件

    声明对象变量的另一种方法类似于“ id <NSObject> ,意思是“实现 NSObject 协议

        3
  •  11
  •   Julien Chastang    16 年前

    从我对Objective-C的有限理解来看,并非所有对象都是从NSObject派生的(不像Java中所有对象都是从Object派生的)。理论上可以有其他根对象。id可以应用于任何非NSObject派生的对象。

        4
  •  0
  •   Daniel Murali    10 年前

    id ,它不再意味着它将是 NSObject * ,它只是意味着它将是任何确认该协议的类。

    NSObject 的类别 NSDelayedPerforming 该方法:

    id testId;
    [testId performSelector:@selector(isKindOfClass:) withObject:[NSObject class] afterDelay:.5];
    

    但是,此代码将显示错误 No known instance method for selector "performSelector:withObject:afterDelay:" :

    id<NSMutableCopying> testId;
    [testId performSelector:@selector(isKindOfClass:) withObject:[NSObject class] afterDelay:.5];