Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 消息传递-编译器赢得';t检查方法是否存在?_Ios_Objective C - Fatal编程技术网

Ios 消息传递-编译器赢得';t检查方法是否存在?

Ios 消息传递-编译器赢得';t检查方法是否存在?,ios,objective-c,Ios,Objective C,在Objective-C的Wiki页面中,有一个名为的部分。它说,在编译时,Objective-C不关心对象是否具有给定的方法,因为任何人都可以向另一个对象发送消息。这是动态绑定 < C++ > Obj>方法(参数);如果没有办法,那就错了。 在Objective-C中,[obj方法:参数];如果没有办法,可以 但在我的日常编码中,使用XCode,若编译器找不到对象的公共方法,它总是在构建之前提示错误。像这样, “ClassName”没有可见的@interface声明选择器“methodName

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

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

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

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


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

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


但是,如果您使用手动引用计数(MRC),则编译器不需要此信息
(其中一些信息仍然是生成与ABI一致的代码所必需的),如果找不到特定的消息/方法/选择器,则不会发出错误。但是,为了安全起见,它确实发出了一个警告。

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

然而,如果你告诉编译器你不在乎或者没有给它足够的信息,那么它是完全有效的

例如:

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

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

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

我不认为这是原因——至少在OP的具体案例中不是这样。(否则你在这里描述的是真的,它不适合这个问题。)谢谢!我只是尝试在没有ARC的情况下创建一个新项目,并键入一些测试代码。是的,它将发出警告,但构建可以通过。[困惑解决:是];编译器还需要知道没有ARC的参数类型。警告意味着编译器必须猜测类型是什么。如果它猜错了,它将错误地编译代码。修复警告。“编译器不需要此信息”为false。编译器确实需要它。如果可能的话,我们会将此警告升级为错误。@H2CO3编译器确实需要MRC中的信息,如果没有所述信息,它只是对如何处理比较宽容。它编译并不意味着生成的代码可以工作。这不仅与保留/发布行为有关,还与调用站点本身有关。例如,如果没有精确、明确的类型信息,编译器将不知道要使用哪个
objc_msgSend()
变量。这个警告应该是一个硬错误,但是有太多的代码依赖于模糊行为。@bbum我知道。我知道所有这些,我写了几个答案,问“为什么C语言中需要声明”。这只是我使用的语言/措辞中的一个错误,格雷帕克利用了这个错误来歪曲我的话。我希望您注意到答案中的“生成与ABI一致的代码仍然有一些必要!”!?如果您试图调用一个未定义的方法,编译器甚至会发出警告。除其他外,这是一个极大的便利——你知道你在编码时输入了错误,而不是必须深入测试会话才能发现你输入了x而不是s。