gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:50:57 28 4
gpt4 key购买 nike

我想知道在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com