私は Quartz Core のまったくの初心者なので、これをデバッグする方法についてヒントを教えてください。
これは具体的に QuartzCore とは何の関係もありません (少なくとも、そうでないことを願っています) — それは一般的なものです。 .
Xcode の場合:
- 現在のスキームを編集します。
- プロファイル アクションの場合は、デバッグ ビルド構成を使用するように設定します。
- それを却下してから、プロファイルコマンドを押してください。
Xcode はそのアクションのためにビルドし、Instruments を起動します。
楽器は、テンプレートを選択するように求めます。ゾンビのテンプレートが必要です。選択すると、Instruments がトレース ドキュメントを作成し、アプリケーションを実行します。アプリケーションに切り替えて (まだ最前面にない場合)、クラッシュの原因となるすべてのことを行います。
クラッシュが本当に死んだオブジェクトのクラッシュである場合、ゾンビはそれを明らかにします。Instruments のタイムラインに「ゾンビ オブジェクト 0xd3c2b1a0 にメッセージが送信されました」などのフラグが表示され、その後すぐにプログラムが終了する可能性があります。
そのフラグには、次のような小さなボタンがあります: ➲ 灰色になることを除いて。クリックして。
これにより、そのオブジェクトの履歴(実際には、そのアドレスで開始された以前のオブジェクトやその他の割り当てを含む、そのアドレスの履歴) に移動します。拡張詳細ペイン (スタック トレースを示す右側に表示されるペイン) を表示し、最後までスクロールしてから、リリースと自動リリースを見て、時間をかけて段階的に後方 (上方) に移動します。オブジェクトの割り当てまたは保持のバランスをとっていません。
ソリューションには、おそらく次の 1 つ以上が含まれます。
- プロパティを/ではなく
strong
orに変更するweak
assign
unsafe_unretained
- 以前にオブジェクトを強く所有していなかったプロパティを追加する
- 上記のどれを行う必要があるかが明確でない場合、またはそれらのいずれかが不潔なハックのように思われる場合は、いくつかのことを再設計します
- ARC に切り替えて、
weak
プロパティと__weak
インスタンス変数 (どちらもnil
参照されたオブジェクトが終了すると自動的に設定されます) を取得し、暗黙的に初期化されるローカル変数を取得します。nil
ただし、Instruments で何を見つけるかによって異なります。そしてもちろん、あなたの問題 (アクセスの悪さ) が死んだオブジェクトではなく、上記のすべてが役に立たない可能性もあります。