猿问

在目标C中向0发送消息

在目标C中向0发送消息

作为一个正在阅读Apple的目标-C2.0文档的Java开发人员:我想知道向零发送信息“意思是-更不用说它的实际用处了。从文档中摘录:

可可有几种模式利用了这一事实。从消息返回到零的值也可能是有效的:

  • 如果该方法返回一个对象、任何指针类型、小于或等于size of(void*)的任何整数标量、浮点数、双、长双或长,则发送给零的消息返回0。
  • 如果该方法返回由MacOSXABI函数调用指南在寄存器中返回的结构,那么发送给nil的消息对于数据结构中的每个字段返回0.0。其他结构数据类型将不填充零。
  • 如果该方法返回上述值类型以外的任何内容,则发送给nil的消息的返回值未定义。

难道Java让我的大脑无法探索上面的解释了吗?或者说,我错过了什么东西,可以像玻璃一样清楚地说明这一点?

我确实在目标C中理解了消息/接收者的概念,我只是对一个恰好是nil.



慕勒3428872
浏览 342回答 3
3回答

慕娘9325324

所有其他帖子都是正确的,但也许这是一个重要的概念。在Object-C方法调用中,任何可以接受选择器的对象引用都是该选择器的有效目标。这节省了很多“X类型的目标对象吗?”代码-只要接收对象实现选择器,它就会使绝对没有区别这是什么课!nil是一个接受任何选择器的NSObject-它就是不接受做什么都行。这消除了很多“检查为零,如果是真的不要发送消息”的代码。(“如果它接受它,它实现它”的概念也是允许您创建的。协议,这有点像Java接口:一个声明,如果一个类实现了指定的方法,那么它就符合协议。)这样做的原因是为了消除猴子代码,除了让编译器高兴之外,它什么也不做。是的,您将获得另一个方法调用的开销,但您可以保存程序员时间,这是一个比CPU时间更昂贵的资源。此外,您正在从应用程序中消除更多的代码和更多的条件复杂性。澄清选民:你可能认为这不是个好方法,但这是语言的实现方式,也是推荐的编程成语目标-C(参见斯坦福大学iPhone编程讲座)。

呼唤远方

在引用文档的话中,有两个单独的概念-如果文档能更清楚地说明这一点,也许会更好:可可有几种模式利用了这一事实。从消息返回到零的值也可能是有效的:前者在这里可能更相关:通常能够将消息发送到nil使代码更简单-您不必到处检查空值。标准示例可能是访问器方法:- (void)setValue:(MyClass *)newValue {     if (value != newValue) {          [value release];         value = [newValue retain];     }}如果向nil如果无效,则此方法将更加复杂-您必须进行两次额外的检查才能确保value和newValue不是nil在给他们发信息之前。后一点(从消息返回到nil通常也是有效的),但是,给前者增加了一个乘数效应。例如:if ([myArray count] > 0) {     // do something...}此代码再次不需要检查nil价值,自然流动.。所有这一切都表明,能够将消息发送到nil确实要付出一些代价。有一种可能性是,您可能会在某个阶段以一种特殊的方式编写失败的代码,因为您没有考虑到值可能是nil.
随时随地看视频慕课网APP

相关分类

iOS
我要回答