Objective c 有任何信息发送到id编译,根据?

Objective c 有任何信息发送到id编译,根据?,objective-c,methods,Objective C,Methods,在Xcode中,如果我写- id a; 当我开始向[a…]写消息时,Xcode给出了一长串自动完成建议。这些建议是基于什么基础而来的(显然是所有可能的方法名称) 我可以编译任何方法调用,比如 [a viewDidLoad]; 我知道我可以接受任何信息。 但是 不编译。这里您可以看到什么是id typedef struct objc_object { Class isa; } *id; 它根本不是void*,而是指向包含单个成员的struct的指针,指向类定义。因此,它可以在运行时以

在Xcode中,如果我写-

id a;
当我开始向[a…]写消息时,Xcode给出了一长串自动完成建议。这些建议是基于什么基础而来的(显然是所有可能的方法名称)

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

[a viewDidLoad];
我知道我可以接受任何信息。 但是


不编译。

这里您可以看到什么是
id

typedef struct objc_object {
    Class isa;
} *id;
它根本不是
void*
,而是指向包含单个成员的
struct
的指针,指向类定义。因此,它可以在运行时以任何数据类型的形式出现。动态键入的

在编译时,它检查方法名是否正确(如果存在)

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


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

这里您可以看到
id是什么

typedef struct objc_object {
    Class isa;
} *id;
它根本不是
void*
,而是指向包含单个成员的
struct
的指针,指向类定义。因此,它可以在运行时以任何数据类型的形式出现。动态键入的

在编译时,它检查方法名是否正确(如果存在)

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

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

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

这些建议有点明智:据我所知,它们在类和对象所采用的协议中都很重要。由于
id
是泛型的,因此,任何存在的消息都可能被发送给它(它可能会响应,也可能不会响应),Xcode建议它在任何类或协议中找到的任何消息

但是[asdfgh];不编译

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

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

这些建议有点明智:据我所知,它们在类和对象所采用的协议中都很重要。由于
id
是泛型的,因此,任何存在的消息都可能被发送给它(它可能会响应,也可能不会响应),Xcode建议它在任何类或协议中找到的任何消息

但是[asdfgh];不编译


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

“id就像void*”-对不起,这是关于
id
是什么的最糟糕/最具误导性的解释之一。@H2CO3:我为什么如此爱,就在这里,每天都教会我很多。“id就像虚空一样”-对不起,这是关于
id
是什么的最糟糕/最具误导性的解释之一。@H2CO3:我为什么如此爱,就在这里,每天都教会我很多。