在Xcode中,如果我写 -
id a;
当我开始向a写一条消息时,[a ...,Xcode提供了一长串自动完成建议。这些建议将以什么为基础(显然所有可能的方法名称)?
我可以编译任何方法调用,比如
[a viewDidLoad];
我知道id可以接收任何消息。 但
[a asdfgh]; //asdfgh random string
无法编译。
答案 0 :(得分:2)
这些建议的基础是什么(显然所有可能的方法名称)?
这些建议有点聪明:据我所知,它们计入了一个对象的类和采用的协议。由于id
是通用的,因此,任何现有的消息都可能被发送给它(它可能会或可能不会响应),Xcode建议在任何类或协议中找到它。
但是[a asdfgh];不编译
因为编译器确实提供了某种程度的保护。如果没有在任何地方声明选择器,它会假定选择器不存在,因此不可能将它发送到任何对象,因此它会抱怨。
答案 1 :(得分:1)
在这里,您可以看到id
typedef struct objc_object {
Class isa;
} *id;
它根本不是void *
,而是指向包含单个成员的struct
的指针,指向类定义。因此,它可以在运行时采用任何数据类型的形式。 动态键入。
在编译时它检查正确的方法名称(如果存在)?
[a asdfgh];
会产生错误,因为没有名称为asdfgh
的方法/选择器。
虽然[a viewDidLoad];
编译得很好,但是在运行时它可能会崩溃!