ios - 我们必须在 -init 中将所有属性设置为 nil 还是自动发生?

标签 ios objective-c memory-management properties

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

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

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

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

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

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

最佳答案

有问题的开发者是错误的 您应该高度怀疑他们给您的任何其他“建议”。

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

静态变量也将始终被初始化为零/零/NULL。局部变量将在 manual-retain-release 下未初始化,并在使用 ARC 时初始化为零/零/NULL。

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

  • 链接器将去除所有调试符号。这使代码更难调试,但会使可执行文件小得多。

  • 优化器将针对代码大小和速度进行优化。

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

关于ios - 我们必须在 -init 中将所有属性设置为 nil 还是自动发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16738482/

相关文章:

objective-c - 在 Core Graphics 中倾斜路径/形状

iOS UILabel 位置在调用 setText 时重置

ios - Swift 2 - 在 Obj-C 中使用时的完成 block 语法

javascript - 当可能必须删除模块以节省内存时是否可以使用 requirejs

iOS物理内存管理(文件缓存)

iOS:简单的保留周期

iOS 泄漏工具与事件监视器

ios - 在iOS中使用MVVM时如何在不同片段之间进行通信

ios - 返回一个空的 JSON 数组导致 Swift 中出现越界错误

iOS:右滑动手势在 UIPageViewController 中没有响应