UIAlertView按钮操作导致错误

时间:2013-08-11 23:06:06

标签: ios objective-c uialertview

我向用户显示UIAlertView并在其上显示“确定”按钮,当用户按下按钮时,我希望我的委托方法执行操作。但是,当用户按下“确定”按钮时,应用程序崩溃时出现此错误:

Thread 1: EXC_BAD_ACCESS (code=1, address=0xb)

这是我的代码,警报视图显示按钮等没问题,但是一旦按下按钮,这就是我得到的错误。它几乎就像一个断点,但如果我点击前进按钮就没有任何反应。

//.h
@interface ErrorHandling : NSObject <UIAlertViewDelegate> {


//.m
#define myAlertViewsTag 0

- (void)recivedErrorCode:(int)errorCode MethodName:(NSString *)methodName {
    switch (errorCode) {
        case 1: {
            NSLog(@"ERROR = 1");
            message = [[UIAlertView alloc] initWithTitle:@"Error 1:"
                                                 message:@"The supplied registration code does exist."
                                                delegate:self
                                       cancelButtonTitle:@"OK"
                                       otherButtonTitles:nil];
            [SVProgressHUD dismiss];
            [message show];
        }
            break;
        case 2: {
            NSLog(@"ERROR = 2");
            message = [[UIAlertView alloc] initWithTitle:@"Error 2:"
                                                 message:@"Your registration is no longer valid."
                                                delegate:self
                                       cancelButtonTitle:@"OK"
                                       otherButtonTitles:nil];
            message.tag = myAlertViewsTag;
            [SVProgressHUD dismiss];
            [message show];
        }
            break;


        default:
            break;
    }
}


-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    if (message.tag == myAlertViewsTag) {
        if (buttonIndex == 0) {
            // Do something when ok pressed
            NSLog(@"DONE 1");
        } else {
            // Do something for ok
            NSLog(@"DONE 2");
        }
    } else {
        // Do something with responses from other alertViews
        NSLog(@"DONE 3");
    }
}

更新: 这就是我从上面的代码类中调用上面代码的类。

 // Do whatever you need to with the error number
 ErrorHandling *errorHandling = [[ErrorHandling alloc] init];
 [errorHandling recivedErrorCode:errorRecivedFromServerInt MethodName:methodName];

3 个答案:

答案 0 :(得分:1)

问题在于ErrorHandling实例的生命周期。您创建一个实例,然后调用recivedErrorCode:方法。之后,没有其他强引用您的errorHandling实例,因此它将被取消分配。

同时警报视图使实例成为委托。当您点击警报视图上的按钮时,警报视图会尝试联系其代理。但是代理已被解除分配,现在指向垃圾内存导致崩溃。

解决方案是对ErrorHandling实例保持更持久的强引用。至少在警报视图被解除之前。

BTW - 您的方法名称有拼写错误 - 它应该是receivedErrorCode:

答案 1 :(得分:0)

这段代码完全不清楚:

   if (message.tag == myAlertViewsTag)...

实际指向任何有效的东西。消息对象是否仍然存在...我认为你的问题就在那里,某处。如果您需要更多帮助,请发布更多有助于我们理解此问题的代码。

答案 2 :(得分:0)

在alertView中:didDismissWithButtonIndex:您正在使用“message.tag”检查警报视图的标记。

看起来你打算将消息变成班上的ivar。一个更好的解决你的bad_access的方法是使用传递给didDismissWithButtonIndex的警报视图,而不是在你的类中保留UIAlertView。这段代码可以解决问题:

 -(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    if (alertView.tag == myAlertViewsTag) {
        if (buttonIndex == 0) {
            // Do something when ok pressed
            NSLog(@"DONE 1");
        } else {
            // Do something for ok
            NSLog(@"DONE 2");
        }
    } else {
        // Do something with responses from other alertViews
        NSLog(@"DONE 3");
    }
}