我们是否必须在-init中将所有属性设置为nil,或者这是否会自动发生?

ope*_*rog 2 memory-management properties objective-c ios

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

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

当您构建分发时,神话也是如此,编译器优化会剥离这个"不必要的"调试代码以使代码更快.

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

到目前为止,我的所有应用程序总是假设属性为零,除非我设置了一个对象.

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

bbu*_*bum 13

有问题的开发人员是错的 ,你应该持有他们给你的任何其他"建议",因为他们非常怀疑.

所有实例变量(包括由其合成的变量)@property将始终在Objective-C运行时分配时归零.这是自语言开始以来Objective-C运行时的已定义的,已记录的行为.

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

DEBUG和RELEASE版本之间有两个主要区别:

  • 链接器将剥离任何调试符号.这使代码更难调试,但使可执行文件变得更小.

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

这是导致DEBUG和RELEASE之间行为发生"神秘"变化的第二个因素.优化器将重用代码中的堆栈空间和重新排序操作(可以重新排序;例如,方法调用不能),以使代码更快更小.这往往会发现DEBUG构建中存在的错误,但不会因为编译器没有在堆栈中移动东西而跳闸.