objective-c - 将消息传递为零的开销/风险

标签 objective-c null

我想知道在 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 be nil for object return types, 0 for numeric types, and NO for BOOL 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/

相关文章:

objective-c - Apple 更改了命名约定的内存管理规则

java - 如何避免在方法链接中检查空值?

iphone - 如何以编程方式从 iPhone 地址簿中获取地址占位符文本?

ios - CoreData 并发 - 我需要一个单独的 NSOperationQueue 吗?

java - Java 中具有两次比较的空安全比较器

c - C 中的 NULL 是否需要/定义为零?

c# - 如果对象不为空,则将对象添加到列表的简写

关于通过 ref、空指针和 IntPtr 传递结构的互操作问题

objective-c - PhoneGap/Cordova iOS : capture video with a duration limit (ie. 30 秒)

ios - CoreData 和预加载 sqlite