发送到id编译的任何消息,基础?

时间:2013-03-02 06:02:03

标签: objective-c methods

在Xcode中,如果我写 -

id a;

当我开始向a写一条消息时,[a ...,Xcode提供了一长串自动完成建议。这些建议将以什么为基础(显然所有可能的方法名称)?

我可以编译任何方法调用,比如

[a viewDidLoad];

我知道id可以接收任何消息。 但

[a asdfgh]; //asdfgh random string

无法编译。

2 个答案:

答案 0 :(得分:2)

  

这些建议的基础是什么(显然所有可能的方法名称)?

这些建议有点聪明:据我所知,它们计入了一个对象的类和采用的协议。由于id是通用的,因此,任何现有的消息都可能被发送给它(它可能会或可能不会响应),Xcode建议在任何类或协议中找到它。

  

但是[a asdfgh];不编译

因为编译器确实提供了某种程度的保护。如果没有在任何地方声明选择器,它会假定选择器不存在,因此不可能将它发送到任何对象,因此它会抱怨。

答案 1 :(得分:1)

在这里,您可以看到id

typedef struct objc_object {
    Class isa;
} *id;

它根本不是void *,而是指向包含单个成员的struct的指针,指向类定义。因此,它可以在运行时采用任何数据类型的形式。 动态键入

在编译时它检查正确的方法名称(如果存在)?

[a asdfgh];会产生错误,因为没有名称为asdfgh的方法/选择器。

虽然[a viewDidLoad];编译得很好,但是在运行时它可能会崩溃!