ARCとカスタムdealloc関数の奇妙な問題のデバッグに時間を費やしました。
- 私はクラスをサブクラス化してい
NSOperation
ます - この操作の完了ブロックを設定しました
- 操作は、非常にフラットなオブジェクトの強力なプロパティ(メソッドなし、自動ivar、2つの強力なプロパティ)によって参照され、このオブジェクトを呼び出すことができます
DataRequest
- すべてのガイドラインに従って、完了ブロックはローカルオブジェクト(操作自体を含む)への弱参照のみを使用します
- コンパイラもアナライザも問題を生成しません
DataRequest
私が生成した操作への唯一の参照を保持し、操作完了ブロックで破棄されます。それは常に破壊されます(dealloc
常に実行されます)- 私の操作にはカスタムがあります
dealloc
。NSLog呼び出しは1つだけです。
...そして問題は:
これをデバッガーで実行すると、deallocのブレークポイントに到達することはなく、ログメッセージが表示されることもありません。主に操作が漏れていると思いました。
これをインストゥルメントで実行すると、すべて問題なく、システムコンソールにメッセージが出力され、Allocationsインストゥルメントは、カスタムdeallocを含む適切なスタックスナップショットから操作が解放されたことを報告します。リークは検出されませんでした。
デバッグとプロファイリングに同じコンパイラ設定を使用していると100%確信しています。
最後に最も紛らわしいのは、のカスタムバージョンを作成してそれ[DataRequest dealloc]
に入れself.operation = nil;
た場合、デバッガーからでもすべて正常に機能することです。
誰かがいくつかの違いを見ようとするコンパイラリンカーオプションのヒントを持っていますか?これはAppleツールのバグである可能性があります(私たち全員が自分たちのエラーのせいで大きな魚を非難する立場にありましたよね?)
...そしてはい、GDBとLLDBで試しました。結果は同じでした-何かを示している可能性があります。
ミニマルなサンプルを作成しようとしましたが、うまくいきました(実際);)
ありがとう