我想知道,在目标C中,将消息传递给零对象是否有任何风险。
在我的代码中,我有很多对UIKit和其他对象的弱引用,这些引用可能随时都会被绑定。由于我来自C++和语言,引用NULL是最快的方法--如何使程序崩溃--我总是非常谨慎,编写防御性代码如下:
if (view)
[view removeFromSuperview];实际上,在将消息传递给视图之前,是否有必要检查视图是否为零?我知道在这种情况下(从superview中删除一个子视图是安全的),但是有可能出现问题吗?
对性能的影响如何?传递给零的信息实际上是免费的,真的什么都不做吗?如果让我说,在一个循环中做上千次呢?
发布于 2013-12-31 17:17:06
object中的方法调用是通过将它们转换为对objc_msgSend()的调用来处理的,后者首先检查接收方是否为nil,然后将其转换为一个特殊的"nil“对象的方法调用。(请参阅博客文章:零)。方法调用设计为对所有类型返回0。请参阅使用对象
注意:如果您期望从发送到
nil的消息返回值,则返回值将为对象返回类型的nil、数值类型的0和BOOL类型的NO。返回的结构将所有成员初始化为零。
因此,总是安全的,。除非你支持遗留系统..。
对传统的编码者来说。
过去,objc_msgSend()只会在标量函数返回的常规寄存器中返回0。PowerPC上的ABI指定r3用于整数和指针返回,有时用于结构的第一个字段(如果将结构打包到寄存器中)。但是,浮点数使用了不同的寄存器,这些寄存器不会被初始化,而结构也不会总是被初始化。
这是一个非常罕见的问题,但无论如何都得到了解决。
发布于 2013-12-31 17:17:42
在目标C中,向nil传递消息是非常正常的,也是预期的。你一般不应该保护自己不受伤害。但是,请记住,将nil传递给某些方法(例如,addObject:)会崩溃,因此您确实需要考虑变量何时可以且不能是nil。
objc_msgSend被高度优化以处理消息传递为零。格雷格帕克做了一个很好的工作,列出了不同的版本,已经存在自10.0。是objc_msgSend中的第一个程序集指令,它是对nil的测试并立即返回。
编辑:
参见Dietrich Epp关于非对象返回如何工作的答案。他说得很好,在这种情况下你确实需要小心。
发布于 2013-12-31 17:16:47
如果没有其他值可供使用,则零值是初始化对象指针的最安全方法,因为在object中将消息发送给nil是完全可以接受的。如果你确实向零发送了一个信息,很明显什么都不会发生。
这意味着您可以发送您想要的没有对象,什么都不会发生。
https://stackoverflow.com/questions/20860840
复制相似问题