2

我一直相信运行时会在创建对象时自动使用 nil 初始化所有属性。

但是 App Store 的发布版本与开发期间的调试版本不同。我听说 Xcode 使用各种安全检查机制围绕变量和属性创建了更稳定的调试版本,这些机制可以防止崩溃但会使代码膨胀。

当您为分发而构建时,神话也是如此,编译器优化会去除这种“不必要的”调试代码以使代码更快。

我已经经历过在发布版本中突然发生的神秘错误。但现在一位开发人员也告诉我:在发布版本中,运行时不会将属性设置为 nil。它们未初始化。它们的价值是垃圾内存,除非您手动执行。因此!foobar,除非您使用 nil 初始化属性,否则检查是不安全的。

到目前为止,除非我设置对象,否则我所有的应用程序始终假定属性为零。

这是正确的还是在我们创建对象时运行时仍然将我们的属性初始化为 nil?

4

2 回答 2

15

有问题的开发人员是错误的 ,你应该接受他们给你的任何其他“建议”作为高度怀疑。

所有实例变量,包括那些由 合成的@property,在分配时总是会被 Objective-C 运行时清零。自语言诞生以来,这就是 Objective-C 运行时的定义和记录的行为。

静态变量也将始终初始化为零/nil/NULL。局部变量将在手动保留释放下未初始化,并在使用 ARC 时初始化为零/nil/NULL。

DEBUG 和 RELEASE 构建之间有两个主要区别:

  • 链接器将删除任何调试符号。这使代码更难调试,但使可执行文件相当小。

  • 优化器将优化代码大小和速度。

正是第二个导致了 DEBUG 和 RELEASE 之间行为的“神秘”变化。优化器将根据需要重新使用堆栈空间并重新排序代码中的操作(可以重新排序;例如,方法调用不能)以使代码更快更小。这往往会发现 DEBUG 构建中存在的错误,但不会因为编译器没有在堆栈上移动东西而被触发。

于 2013-05-24T16:25:12.220 回答
2

假设你会没事的nil

编译器在发布版本中并没有真正做任何不同的事情——我认为它只去除了调试内容(NSLogs、断点处理程序、异常暂停等)。

于 2013-05-24T15:26:15.890 回答