1. ホーム
  2. objective-c

[解決済み] ViewController の respondsToSelector: 割り当て解除されたインスタンスにメッセージが送信される (CRASH)

2023-01-28 07:16:37

質問

さて、ここからが本題ですが、私は が嫌いです。 を出すのは嫌いです。なぜなら、私は通常それらを自分で処理するからですが、私はただ できない の後にでも、私の方法を得ることができます。 すでに複数の質問を表示する .

OK、ここに問題があります、私は私のアプリがこのスタックトレースでランダムにオンとオフのクラッシュを見つけます。

*** -[ViewController respondsToSelector:]: message sent to deallocated instance 0x1e5d2ef0

ここで ViewController は様々で、私のコードがクラッシュする場所には NO という関連性を持っています。 ViewController であり、それを所有したり呼んだりしているわけではありません。

また、コンソールトレースを取得するために、私はゾンビを有効にしました。そうでなければ、私はコンソールプリントを全く取得できず、ただ objc_msgSend と表示されるだけです。これは、リリースされている何かをメッセージングしていることを意味します。でも、それがどこにあるのかがわからないのです...。私は本当に困っています 通常、私は いつも デバッグしています。

繰り返しますが、これは異なる場所で、異なる時間に、オンとオフでクラッシュします。そして、クラッシュする場所には、ほとんど いいえ との関連性はありません。 ViewController . そして、私はこれが非常に紛らわしいと思います。

私のコードのどれかが必要なのでしょうか?私は持っている たくさん のファイルがあり、さまざまな場所でクラッシュしているので、私のコードを配布すると混乱します!

シンボリック ブレークポイントを追加しようとしましたがうまくいかず、iOS 用の Instruments アプリケーションでは Zombies は使用できません。シミュレーターにはサポートされていないアーキテクチャーのフレームワークがあるため、私のアプリをシミュレーター上で実行することはできません。

みなさんありがとうございます...

どのように解決するのですか?

使用方法 楽器 を使用して、割り当て解除されたインスタンス エラーを追跡します。アプリケーションのプロファイル ( Cmd ⌘(英語 + I を選択し ゾンビ というテンプレートを使います。アプリケーションを実行した後、クラッシュさせてみてください。このようなものが表示されるはずです。

ポップオーバーのアドレスの横にある矢印をクリックすると、割り当て解除後に呼び出されたオブジェクトが表示されます。

このオブジェクトの保持カウントを変更したすべての呼び出しが表示されるはずです。これは、retain/releaseメッセージを直接送信したり、autoreleaseプールを排出したり、NSArraysに挿入したりすることが原因です。

参照 カラムは、アクションが呼び出された後のretainCountと 呼び出し元責任者 には、それが実行されたクラス名とメソッドが表示されます。retain/releaseをダブルクリックすると、それが実行されたコードの行が表示されます (これが機能しない場合は、呼び出しを選択して 拡張された詳細 ペインで対応するコードを選択することで呼び出しを調べることができます)。

これにより、すべての retainCount のライフサイクルをすべて調べることができ、おそらくすぐに問題を見つけることができるでしょう。あなたがしなければならないことは、欠落している retain を見つけることです。 リリース .