3

ワンボタンのiPhoneサンプルアプリケーションがあります。タップするとコードが呼び出されます:

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

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

問題は、アラートで [OK] ボタンをクリックすると、アプリケーションが EXC_BAD_ADDRESS でクラッシュすることです。おそらく、アラートが既にアークによって削除されているためです。

これを解決するための推奨される方法は何ですか? プロパティをviewcontrollerに追加せずに

ありがとう

4

2 に答える 2

5

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

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

これの理由は、UIAlertViewを作成するオブジェクトがそれへの参照を保持し、それがデリゲートであるため、ループを閉じてリリースを防止する一般的なケースのように、ループとリリースの失敗を防ぐためだと思います。

これはおそらくデリゲートの一般的なパターンですが、まったく同じ問題に遭遇するまで気づきませんでした。ゾンビ検出を有効にしてシミュレーターを実行したところ、参照カウントが明確に示され、UIAlertView によって保持されていないことがわかりました。ヘッダーファイルを確認したときです。

この質問への回答は、システム クラスのデリゲートと assign キーワードに関する追加情報を提供します。 iPhone ARC リリース ノート - システム クラス デリゲートの割り当てを解除しますか?

于 2012-07-02T23:59:37.293 に答える