我有一个难以跟踪的错误,它只出现在我的应用程序的发布版本中,而不是在调试版本中。构建之间的相关差异结果是 Debug 构建是在没有任何编译器优化的情况下编译的,而 Release 构建是在编译时使用的-O
(该错误也可以在所有其他优化设置上重现)。这一切都在 LLVM 上。
在我的视图控制器中,我有一个属性self.basicInfoContainerView
定义为:
@property (weak, nonatomic) IBOutlet UIView *basicInfoContainerView;
然后我从一个视图中删除了子视图,并将其添加到另一个视图中。
[self.basicInfoContainerView removeFromSuperview];
[self.infoTextView addSubview:self.basicInfoContainerView];
根据编译器优化级别,会发生不同的事情。
优化:一旦视图从其父视图中删除,视图就会被释放并self.basicInfoContainerView
归零,因此不会作为子视图添加到新视图中。
关闭优化:子视图没有立即解除分配,而是作为子视图成功添加到新视图中。
(当我将属性存储限定符更改为 时strong
,视图在两种情况下都存在,但即使这解决了问题,但这并不是我的问题。)
我希望有人能帮助我了解这里到底发生了什么。weak
当编译器优化关闭时,为什么不立即释放我的视图(如果保留计数 == 0,则将指针归零)?