0

次の方法でデリゲートをUIAlertViewに設定しています。

PhotoViewController *controller = [[PhotoViewController alloc] init];

UIAlertView *alert = [[UIAlertView alloc]
                      initWithTitle: @"Announcement"
                      message: @"It turns out that you are playing Addicus!"
                      delegate: controller
                      cancelButtonTitle:@"OK"
                      otherButtonTitles:nil];
[alert show];

PhotoViewControllerが現在のUIviewContorllerではない場合。アラートは正常に読み込まれますが、[OK]ボタンを押すとすぐにアプリがクラッシュし、次のエラーが発生します。

0x3a61a5b0:ldr r3、[r4、#8] EXC BAD ACCESS

これは何を意味するのでしょうか?

編集:

+ (DejalActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)aLabelWidth;
{
// Immediately remove any existing activity view:
if (dejalActivityView)
    [self removeView];

// Remember the new view (so this is a singleton):
dejalActivityView = [[self alloc] initForView:addToView withLabel:labelText width:aLabelWidth];

if ([labelText isEqualToString:@"Uploading photo (this process might take a while)"]) {
buttonCancel = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[buttonCancel addTarget:dejalActivityView
                 action:@selector(callCancelAlert:)
       forControlEvents:UIControlEventTouchDown];
buttonCancel.frame = CGRectMake(230, 540, 265, 40);
[addToView addSubview:buttonCancel];
[buttonCancel setImage:[UIImage imageNamed:@"socialize-navbar-bg.png"] forState:UIControlStateNormal];
[buttonCancel setTitle:@"Cancel upload" forState:UIControlStateNormal];
}

return dejalActivityView;
}

-(IBAction)callCancelAlert:(id)sender{

PhotoViewController *controller = [[PhotoViewController alloc] init];

UIAlertView *alert = [[UIAlertView alloc]
                      initWithTitle: @"Announcement"
                      message: @"It turns out that you are playing Addicus!"
                      delegate: controller
                      cancelButtonTitle:@"OK"
                      otherButtonTitles:nil];
[alert show];
//[alert release];
}
4

1 に答える 1

4

デリゲートは保持されたプロパティではありません。これはcontroller、スコープ外になると、ARC がそれを解放し、別のオブジェクトによって保持されていないため、割り当てが解除されることを意味します。アラート ビューがデリゲートにメッセージを送信しようとすると、アドレスが無効になり、例外が発生します。

アラート ビューのデリゲートは、アラート ビュー自体よりも長く存続する必要があります。通常、アラート ビューを作成するオブジェクトはデリゲートである必要があります。アラート ビューを作成するクラスにデリゲート コードを移動する必要があります。

于 2013-03-11T20:23:11.230 に答える