首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将消息传递给零的开销/风险

将消息传递给零的开销/风险
EN

Stack Overflow用户
提问于 2013-12-31 17:11:33
回答 4查看 392关注 0票数 2

我想知道,在目标C中,将消息传递给零对象是否有任何风险。

在我的代码中,我有很多对UIKit和其他对象的弱引用,这些引用可能随时都会被绑定。由于我来自C++和语言,引用NULL是最快的方法--如何使程序崩溃--我总是非常谨慎,编写防御性代码如下:

代码语言:javascript
复制
if (view)
   [view removeFromSuperview];

实际上,在将消息传递给视图之前,是否有必要检查视图是否为零?我知道在这种情况下(从superview中删除一个子视图是安全的),但是有可能出现问题吗?

对性能的影响如何?传递给零的信息实际上是免费的,真的什么都不做吗?如果让我说,在一个循环中做上千次呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-12-31 17:17:06

object中的方法调用是通过将它们转换为对objc_msgSend()的调用来处理的,后者首先检查接收方是否为nil,然后将其转换为一个特殊的"nil“对象的方法调用。(请参阅博客文章:)。方法调用设计为对所有类型返回0。请参阅使用对象

注意:如果您期望从发送到nil的消息返回值,则返回值将为对象返回类型的nil、数值类型的0BOOL类型的NO。返回的结构将所有成员初始化为零。

因此,总是安全的,。除非你支持遗留系统..。

对传统的编码者来说。

过去,objc_msgSend()只会在标量函数返回的常规寄存器中返回0。PowerPC上的ABI指定r3用于整数和指针返回,有时用于结构的第一个字段(如果将结构打包到寄存器中)。但是,浮点数使用了不同的寄存器,这些寄存器不会被初始化,而结构也不会总是被初始化。

这是一个非常罕见的问题,但无论如何都得到了解决。

票数 7
EN

Stack Overflow用户

发布于 2013-12-31 17:17:42

在目标C中,向nil传递消息是非常正常的,也是预期的。你一般不应该保护自己不受伤害。但是,请记住,将nil传递给某些方法(例如,addObject:)会崩溃,因此您确实需要考虑变量何时可以且不能是nil

objc_msgSend被高度优化以处理消息传递为零。格雷格帕克做了一个很好的工作,列出了不同的版本,已经存在自10.0。objc_msgSend中的第一个程序集指令,它是对nil的测试并立即返回。

编辑:

参见Dietrich Epp关于非对象返回如何工作的答案。他说得很好,在这种情况下你确实需要小心。

票数 3
EN

Stack Overflow用户

发布于 2013-12-31 17:16:47

根据苹果的文档,https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html

如果没有其他值可供使用,则零值是初始化对象指针的最安全方法,因为在object中将消息发送给nil是完全可以接受的。如果你确实向零发送了一个信息,很明显什么都不会发生。

这意味着您可以发送您想要的没有对象,什么都不会发生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20860840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档