1

我正在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];
4

3 回答 3

1

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

同时,警报视图已将实例作为其委托。当您点击警报视图上的按钮时,警报视图会尝试联系其代表。但是委托已被释放,现在指向导致崩溃的垃圾内存。

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

顺便说一句-您的方法名称有错字-应该是receivedErrorCode:.

于 2013-08-12T00:25:19.140 回答
0

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

看起来您打算让 message 在您的班级中成为 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");
    }
}
于 2013-08-11T23:56:43.127 回答
0

从这段代码中根本不清楚这一行是否:

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

实际上指向任何有效的东西。消息对象是否仍然存在...我认为您的问题就在某个地方。如果您需要更多帮助,请发布更多代码以帮助我们理解这一点。

于 2013-08-11T23:20:20.927 回答