我想知道在 Objective C 中将消息传递给 nil 对象不会执行任何操作,这样依赖是否存在任何风险。
在我的代码中,我有很多对 UIKit 和其他对象的弱引用,这些引用可能随时被清除。由于我来自 C++ 和语言,其中引用 NULL 是导致程序崩溃的最快方法,因此我总是倾向于谨慎并编写如下防御性代码:
if (view)
[view removeFromSuperview];
在向 View 传递消息之前,实际上是否有必要检查 View 是否不为零?我知道在这种情况下(从 super View 中删除 subview 是安全的),但是在任何情况下这可能会出现问题吗?
性能影响如何?向 nil 传递消息实际上是免费的并且真的什么都不做吗?如果我假设循环执行数千次怎么办?
最佳答案
Objective-C 中的方法调用是通过将其转换为对 objc_msgSend()
的调用来处理的。 ,它首先检查接收者是否是 nil
,然后它将其转换为对特殊“nil”对象的方法调用。 (参见博客文章:Nil)。该方法调用旨在为所有类型返回 0。请参阅Working with Objects :
Note: If you expect a return value from a message sent to
nil
, the return value will benil
for object return types,0
for numeric types, andNO
forBOOL
types. Returned structures have all members initialized to zero.
所以它始终安全。除非您支持遗留系统...
对于遗留编码员...
以前是objc_msgSend()
对于标量函数返回,只会在常用寄存器中返回 0。 PowerPC 上的 ABI 指定 r3
将用于整数和指针返回,有时用于结构的第一个字段(如果结构被打包到寄存器中)。但是, float 使用了不同的寄存器,这些寄存器不会被初始化,并且结构体也不会总是被初始化。
这是一个极其罕见的问题,但无论如何已经解决了。
关于objective-c - 将消息传递为零的开销/风险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20860840/