ARCとカスタムdealloc関数で奇妙な問題をデバッグするのに少し時間を費やしました。XcodeとARCのデバッグに関する問題(deallocをスキップ)
- 私は操作が非常フラットオブジェクト(NO方法、自動アイバーズ、2つの強力な特性)の強い性質によって参照され、この動作のため
- を完了ブロックを設定
NSOperation
クラスをサブクラス化していこのオブジェクトを呼び出すことができますDataRequest
- すべてのガイドラインに従うと、完了ブロックはローカルオブジェクト(操作自体を含む)への弱い参照のみを使用します
- コンパイラもアナライザも
DataRequest
は、私が生成する操作のみを保持し、操作完了ブロックで破棄されます。いつも破壊されています(そのdealloc
は常に実行されます)- 私の操作はカスタム
dealloc
です。私はそれに単一のNSLogの呼び出しを持っています。
...と問題がある:私はデバッガで、この下を実行した場合、deallocを中にブレークポイントにヒットされることはありません
ログメッセージが表示されません。主に私は手術が漏れていると思った。
これを計測器で実行すると、システムコンソールがメッセージを出力し、Allocations計測器はカスタムdeallocを含む適切なスタックスナップショットから解放されたことを報告します。リークは検出されませんでした。
私はデバッグとプロファイリングに同じコンパイラ設定を使用していることを100%確信しています。最後に
最も混乱を招く事:私は[DataRequest dealloc]
のカスタムバージョンを作成して、私はそれにself.operation = nil;
を入れた場合 - すべてがさえデバッガから正常に動作します。
何人かのコンパイラリンカオプションがいくつかの違いを見てみるためにいくつかのヒントを持っていますか?これはアップルのツールのバグかもしれません(私たち全員が大きな魚を私たち自身のエラーのために責めていたのですか?)
...はい私はGDBとLLDBを試しました。結果は同じだった - 何が何かを示すかもしれない。
(実際に)私は、最小限のサンプルを作成しようとしましたが、それだけで働いていた;あなたは)
おかげ
私は非常に基本的な観察をしました...私がXCode(GDBまたはLLDB)からシミュレータでアプリケーションを実行すると、 'dealloc'のログメッセージは表示されません。デバッガを終了してシミュレータから直接起動すると、Console.appはすべてのメッセージを表示します。その間にはリンクがありません。奇妙な。私はデバッグセッションではXCodeからアプリを実行する場合 – simpleone
...と一つにもより簡単結果は... - のdeallocが呼び出されていない私は、シミュレータで手動でアプリを実行してから、デバッガをアタッチた場合(印刷されていないログ)..すべてが期待通りです。 – simpleone