0

私は優れたTSAlertViewプロジェクトを使用して、視覚障害のある人向けにフォントを拡大したポップアップ アラートを作成しています。残念ながら、数日間頭を悩ませている問題に遭遇しました。

TSAlertViewユーザーがアプリの新しいページに移動して現在のページのコンテンツを確認しようとしているときに、バリデータ ポップアップとして使用しています。つまり、ユーザーがボタンを押してアプリの新しいページに移動するTSAlertViewと、画面にポップアップが表示され、ユーザーが [はい] ボタンを押すと、現在のページがカスタム セグエを使用UIViewControllerして別のページに置き換えられます。UIViewControllerアプリはランダムにクラッシュし、EXC_BAD_ACCESS私の推測では、終了アニメーションが完了するUIViewController前に現在の割り当てが解除されるとクラッシュするということです。TSAlertView

明らかな回避策は、現在のアニメーションUIViewControllerと新しいアニメーションの間のアニメーションの時間を長くすることですが、それは単にタイミングの良さに依存するだけであり、これは災害のレシピです。UIViewController割り当てが解除されるまで、プレゼンテーションの割り当てが解除されないようにする簡単な方法TSAlertViewはありますか? メイン プロジェクトは ARC を使用していますTSAlertViewが、非 ARC です。

編集:ラバーダッキングの動作。-(void) showメソッドに次の 2 行を追加しました。

_presentingViewController = [[UIApplication sharedApplication] keyWindow].rootViewController;
[_presentingViewController retain];

と で対応release-(void) deallocます。現在、すべてが適切に機能しているようです。循環保持チェーンを作成していますか? より良い答えはありますか?

4

2 に答える 2

3

Peter Hoseyは正しいです-クラッシュの原因を正確に見つけるには、ゾンビを使用する必要があります。

ただし、(TSAlertView.hを確認した後)私の直感では、アラートビューを表示するときに、ビューコントローラをデリゲートとして設定していると言っています。おそらく、ビューコントローラの割り当てが解除されており、アラートビューがダングリングポインタと通信しようとしています。

悪い新機能は、コントローラーがAlertViewを保持している場合、修正で保持ループが発生した可能性があることです。そうでない場合でも、変更によって保持ループ発生する可能性が非常に高いため、作成しません。

幸いなことに、ARC以前のベストプラクティスを引き続き適用して、代理人をゼロにすることができます。ARCでは、deallocは引き続き有効なメソッドであり、オブジェクトの割り当てが解除されたときに呼び出されます。superを呼び出さないでください。これにより、オブジェクトが寿命に達したときにクリーンアップする機会が与えられます。アラートビューを表示した後も参照を保持している場合は、次のような操作を実行して、ダングリングポインタをクリーンアップできるはずです。

- (void)dealloc {
    self.alertView.delegate = nil;
}
于 2013-02-12T07:56:17.290 に答える