1

デリゲートパターンの代わりに完了ハンドラブロックを許可するためUIAlertViewに、レギュラーの内部をラップしています。NSObject

問題は、オブジェクトのローカルインスタンスを割り当て、内部でを作成し、UIAlertViewそのデリゲートをオブジェクト自体に割り当てることです。アラートが表示され、ユーザーがボタンをタップすると、EXC_BAD_ACCESSARCが私のオブジェクトを解放し、アラートのデリゲートがそのオブジェクトであるため、アプリがクラッシュします。

この状況にどのように対処できますか?解決策は、ローカル変数をで修飾し __block、完了ブロック内でオブジェクト自体を使用することですが、それは機能しません。

ちなみに、「UIalertView」をラップする代わりにサブクラス化すると機能しますが、ドキュメントにはアラートのサブクラス化は推奨されないと記載されているため、この問題を解決することをお勧めします。

4

1 に答える 1

2

次のように、オブジェクトをアラートビューに関連付けることができます。

#import <objc/runtime.h>

...

- (void)showAlertView
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithWhatever:...];        
    objc_setAssociatedObject(alertView, _cmd, self, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [alertView show];
}

これにより、オブジェクトが保持され、alertViewの割り当てが解除されたときに再度解放されます。オブジェクトはalertViewを保持してはなりません。保持しないと、保持サイクルが発生します。

于 2013-01-28T13:44:59.523 に答える