アプリのリリース ビルドでのみ発生し、デバッグ ビルドでは発生しないバグを追跡するのが困難でした。ビルド間の関連する違いは、デバッグ ビルドはコンパイラの最適化なしでコンパイルされたのに対し、リリース ビルドはコンパイラの最適化を使用してコンパイルされたことであることが判明しました-O
(バグは他のすべての最適化設定でも再現可能でした)。これはすべてLLVM上にあります。
私のView Controllerには、次のようにself.basicInfoContainerView
定義されたプロパティがあります。
@property (weak, nonatomic) IBOutlet UIView *basicInfoContainerView;
次に、あるビューからサブビューを削除し、別のビューに追加しました。
[self.basicInfoContainerView removeFromSuperview];
[self.infoTextView addSubview:self.basicInfoContainerView];
コンパイラの最適化レベルに応じて、さまざまなことが起こりました。
最適化がオンの場合: ビューがスーパービューから削除されるとすぐに、ビューの割り当てが解除self.basicInfoContainerView
されてゼロになり、その結果、新しいビューにサブビューとして追加されませんでした。
最適化がオフの場合: サブビューはすぐに割り当て解除されず、サブビューとして新しいビューに正常に追加されました。
(プロパティ ストレージ修飾子を に変更するstrong
と、ビューは両方のケースで存続しましたが、それでも問題は解決しましたが、それは私の質問ではありません。)
ここで実際に何が起こっているのかを理解するのを手伝ってくれる人が欲しい. weak
コンパイラの最適化がオフになっていると、ビューがすぐに解放されない (保持カウント == 0 の場合はポインターがゼロにならない) のはなぜですか?