Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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
为什么Objective-C块语法与方法语法如此不同?_Objective C_Methods_Syntax_Objective C Blocks - Fatal编程技术网

为什么Objective-C块语法与方法语法如此不同?

为什么Objective-C块语法与方法语法如此不同?,objective-c,methods,syntax,objective-c-blocks,Objective C,Methods,Syntax,Objective C Blocks,问题说明了一切。原因: (void)methodWithParamA:(id)paramA paramB:(id)paramB; [obj methodWithParamA:valA paramB:valB]; 以及: 我不确定通过学习这个问题的答案我是否一定会有所收获,但我很困惑,一种语言可以有这么多不同的语法…一个块就是一个函数,没有“当前实例”(或调用方法的“当前类”)和一个方法一样 因此,块调用看起来像函数调用;“block”类型是指针类型,并且非常接近函数指针类型的语法;块体紧跟函数

问题说明了一切。原因:

(void)methodWithParamA:(id)paramA paramB:(id)paramB;
[obj methodWithParamA:valA paramB:valB];
以及:

我不确定通过学习这个问题的答案我是否一定会有所收获,但我很困惑,一种语言可以有这么多不同的语法…

一个块就是一个函数,没有“当前实例”(或调用方法的“当前类”)和一个方法一样

因此,块调用看起来像函数调用;“block”类型是指针类型,并且非常接近函数指针类型的语法;块体紧跟函数体的语法


块在C中是受支持的,它有函数,但没有方法。

后者是(几乎)普通的C,就像Objective C中的许多与对象无关的东西一样。方括号的东西是Objective C对处理对象的语言的扩展。在这方面,该语言与C语言有很大的不同,但保持了很多类似C的风格(我认为主要是为了与C库头兼容)。关于可能有帮助的话题you@Dave-后者是普通C。它几乎不是普通C。@ArtOfWarfare非标准扩展不是普通C。读了这篇文章,我不禁要问对应的问题:为什么Objective-C方法的方括号空格分隔参数语法?我现在正在学习积木,我觉得奇怪的是它们在语法上与方法如此不同。在阅读您关于块是基于C函数建模的解释后,现在我又开始想,Objective-C方法看起来很奇怪……我猜@Dave在上面的评论中回答了这个问题——Objective-C方法是在C函数之后出现的,语言创建者认为它们需要一种完全不同的语法。唉。@ericsoco-在Objective-C中,当您向对象发送消息以调用方法时,您调用一个函数。这两个过程完全不同。前者是直接的和静态的——它决定了编译时的最终位置。后者是间接的和动态的——在运行时执行搜索以找到与消息匹配的方法,这可能会失败。因此,使用不同的语法是很有意义的,语法遵循Smalltalk的语法。在C++中,方法调用与函数调用没有区别,它们使用类似的语法。@ ErCoSoCo:由SaleTalk的空间部分分隔的关键字冒号参数短语是SMALLATTS。我认为方括号只是为了使新语法不与C语法冲突。
void(^ block)(id paramA, id paramB);
block(valA, valB);