2012-04-15 12 views
3

私は1つのボタンでiphoneサンプルアプリケーションを持っています。タップ上では、コードを呼び出す:ARCアプリのUIAlertView

UIAlertView *alert = [[UIAlertView alloc] 
          initWithTitle:@"test" 
          message:@"test" 
          delegate:self 
          cancelButtonTitle:@"Ok" 
          otherButtonTitles: nil]; 
[alert show]; 

アプリケーションARCが有効になっています。

警告で[OK]ボタンをクリックすると、アプリケーションがEXC_BAD_ADDRESSでクラッシュするという問題があります。おそらく、警告が既に弧で削除されているためです。

これを解決するにはどうすればよいでしょうか?

おかげ

+3

ゾンビ機器を使用して、クラッシュが発生している場所を特定します。 – edc1591

+4

デリゲートメソッドで実際に何をしていますか、そしてどこがクラッシュですか? –

答えて

5

私の推測では、どちらかであるあなたがUIAlertViewDelegateメソッドを実装していないか、または自己がスコープ外になったのViewControllerをするためにプロパティを追加することなく。

アラートボックスを閉じるときに気にする必要がない場合は、代理人をnilに変更します。例:

UIAlertView *alert = [[UIAlertView alloc] 
          initWithTitle:@"test" 
          message:@"test" 
          delegate:nil 
          cancelButtonTitle:@"Ok" 
          otherButtonTitles: nil]; 
[alert show]; 
5

UIAlertViewの委任プロパティは、弱い参照(assignキーワードで示される)として宣言されています。これは、ARCが保持カウントをインクリメントしないことを意味し、デリゲートオブジェクトへの参照を保持する必要があります(それが自己であっても別のオブジェクトであっても)。この参照は、UIAlertViewの全期間にわたって維持される必要があります。

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate; // weak reference 

私はこの理由は、ループと共通の場合のように解放する故障を防止することであると仮定し、それへの参照を保持し、それの代理人がそうループを閉じ、放出を防止するであろうUIAlertViewオブジェクト作成。

これはおそらく代表者の共通パターンですが、まったく同じ問題が発生するまでわかりませんでした。シミュレータでゾンビ検出を有効にして実行しましたが、参照カウントが明確に示されていて、UIAlertViewによって保持されていないことがわかりました。それは私がヘッダーファイルをチェックしたときだった。

この質問の答えは、システムクラスと代入キーワードに関する代理人に関する追加情報を提供します。 iPhone ARC Release Notes - dealloc on system classes delegates?