ARC時代以前は、保持と解放をオーバーライドしてスタックトレースを記録し、オブジェクトを保持する場所を簡単に見つけることができました。器具を持たないARCで円形のデバッグ
これは禁止されていますが、楽器を実行することはオプションではありません(デバイスでアプリを実行しようとするとすぐにクラッシュし、シミュレータでバグは再現されません)。
これは機器なしでARCでどのように行うことができますか?
ARC時代以前は、保持と解放をオーバーライドしてスタックトレースを記録し、オブジェクトを保持する場所を簡単に見つけることができました。器具を持たないARCで円形のデバッグ
これは禁止されていますが、楽器を実行することはオプションではありません(デバイスでアプリを実行しようとするとすぐにクラッシュし、シミュレータでバグは再現されません)。
これは機器なしでARCでどのように行うことができますか?
私は最終的な答えは得られないかもしれませんが、私は正しい方法で試してみることを決めました。
ARCを使用すると、コンパイラはretainCountに尋ねることを許可しません。performSelector:@selector(retainCount)の実行を停止するのに十分なスマートさえあります。しかし、私はそこをあきらめず、この有用なデバッグインジケータにアクセスするために一歩進んで行きました。
[anInstance performSelector:NSSelectorFromString(@"retainCount")];
これはコンパイラを過ぎてしまい、もう少し詳しく説明します。これはスタックではありませんが、この値を多量に記録することでヒントを得ることができます。
私は多分それをあきらめようとしていますが、私はスタックを得るためにはもっと厄介な(読みにくい)手法で遊んでいます。基本的な考え方は、class-addMethod()メソッドまたはmethod_setImplementationのいずれかを使用して、objective-cランタイム経由でretainメソッドを「拡張」することです。これまでのところ私はそれが働くことを望んでいないことを私に与えてくれることを公正な警告を与えます、そして、私はすぐに上記performSelectorコールのより頻繁なログに落ちるかもしれません。
Good Luck!
NSLog("RetainCount: %ld", (CFGetRetainCount((__bridge CFTypeRef) anInstance));
確かに、すべて例では動作しますが、ほとんどないことがあります。
編集私がこれを書いたので、私はCore Foundationの機能を発見しました。 The documentationを参照してください。
例外ブレークポイントを設定しようとしましたか? ブレークポイントパネル、左下に "+"、 "例外ブレークポイントの追加..."、 "完了" 例外をラインに分離することができれば、どのオブジェクトが誤動作しているか調べることができます。これが役に立ちますようお願いいたします。
例外はありません。オブジェクトは解放されていても、まだ生存している必要があるため、論理的なバグです。 – yonix
これはあなたが今すぐできるベストだと思っています... 私は、楽器がクラッシュして私の元の問題に使用している理由を知りました。 – yonix
クール。私はCFGetRetainCountについての私の答えにもメモを追加しましたが、これは私が最近発見したものです。 –