为了账号安全,请及时绑定邮箱和手机立即绑定

在目标C中向0发送消息

在目标C中向0发送消息

慕少森 2019-07-17 10:46:00
在目标C中向0发送消息作为一个正在阅读Apple的目标-C2.0文档的Java开发人员:我想知道向零发送信息“意思是-更不用说它的实际用处了。从文档中摘录:可可有几种模式利用了这一事实。从消息返回到零的值也可能是有效的:如果该方法返回一个对象、任何指针类型、小于或等于size of(void*)的任何整数标量、浮点数、双、长双或长,则发送给零的消息返回0。如果该方法返回由MacOSXABI函数调用指南在寄存器中返回的结构,那么发送给nil的消息对于数据结构中的每个字段返回0.0。其他结构数据类型将不填充零。如果该方法返回上述值类型以外的任何内容,则发送给nil的消息的返回值未定义。难道Java让我的大脑无法探索上面的解释了吗?或者说,我错过了什么东西,可以像玻璃一样清楚地说明这一点?我确实在目标C中理解了消息/接收者的概念,我只是对一个恰好是nil.
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

所有其他帖子都是正确的,但也许这是一个重要的概念。

在Object-C方法调用中,任何可以接受选择器的对象引用都是该选择器的有效目标。

这节省了很多“X类型的目标对象吗?”代码-只要接收对象实现选择器,它就会使绝对没有区别这是什么课!nil是一个接受任何选择器的NSObject-它就是不接受什么都行。这消除了很多“检查为零,如果是真的不要发送消息”的代码。(“如果它接受它,它实现它”的概念也是允许您创建的。协议,这有点像Java接口:一个声明,如果一个类实现了指定的方法,那么它就符合协议。)

这样做的原因是为了消除猴子代码,除了让编译器高兴之外,它什么也不做。是的,您将获得另一个方法调用的开销,但您可以保存程序员时间,这是一个比CPU时间更昂贵的资源。此外,您正在从应用程序中消除更多的代码和更多的条件复杂性。

澄清选民:你可能认为这不是个好方法,但这是语言的实现方式,也是推荐的编程成语目标-C(参见斯坦福大学iPhone编程讲座)。


查看完整回答
反对 回复 2019-07-17
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

在引用文档的话中,有两个单独的概念-如果文档能更清楚地说明这一点,也许会更好:

可可有几种模式利用了这一事实。

从消息返回到零的值也可能是有效的:

前者在这里可能更相关:通常能够将消息发送到nil使代码更简单-您不必到处检查空值。标准示例可能是访问器方法:

- (void)setValue:(MyClass *)newValue {
    if (value != newValue) { 
        [value release];
        value = [newValue retain];
    }}

如果向nil如果无效,则此方法将更加复杂-您必须进行两次额外的检查才能确保valuenewValue不是nil在给他们发信息之前。

后一点(从消息返回到nil通常也是有效的),但是,给前者增加了一个乘数效应。例如:

if ([myArray count] > 0) {
    // do something...}

此代码再次不需要检查nil价值,自然流动.。

所有这一切都表明,能够将消息发送到nil确实要付出一些代价。有一种可能性是,您可能会在某个阶段以一种特殊的方式编写失败的代码,因为您没有考虑到值可能是nil.


查看完整回答
反对 回复 2019-07-17
  • 3 回答
  • 0 关注
  • 485 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信