我向用户显示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];
答案 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");
}
}