0

在 Objective-C 的 Wiki 页面中,有一个名为Messages的部分。它说编译时,Objective-C 不关心对象是否具有给定方法,因为任何人都可以向另一个对象发送消息。这是动态绑定。

在 C++ 中,obj->方法(参数);如果没有方法,那就错了。在 Objective-C 中,[obj 方法:参数];如果没有方法,也可以。

但是在我的日常编码中,使用 XCode,如果编译器找不到对象的公共方法,它甚至在构建之前总是提示错误。像这样,

“ClassName”没有可见的@interface 声明选择器“methodName”

我对这种“矛盾”感到有些困惑。如果问题很愚蠢,请原谅我。提前致谢。

4

2 回答 2

1

我认为编译器只是在保护你免受自己的伤害。在您注意到的情况下,编译器知道您正在调用的方法不存在,因此将其报告为错误。

但是,如果您告诉编译器您不在乎或没有给它足够的信息,那么它是完全有效的。

例子:

NSString* var = @"Hello";
[(id)var thisDoesNotExist];

id var2 = @"Hello";
[var2 neitherDoesThis:var];

这些(应该)都可以编译。

于 2013-08-08T09:38:30.447 回答
0

您可能会使用 ARC。为了编译启用 ARC 的代码,编译器需要知道方法期望作为参数并作为返回值返回的对象类型,以便能够发出对内存管理方法的必要调用。因此,当您编译 ARC 代码时,编译器检查方法签名是否存在。

但是,如果您使用手动引用计数 (MRC),则编译器不需要此信息来实现此目的(其中一些仍然是生成符合 ABI 的代码所必需的),并且它不会发出错误,如果它找不到某个消息/方法/选择器。但是,它确实会发出安全警告

于 2013-08-08T09:35:39.217 回答