我收到以下代码的错误。基本上,应用程序确认从表视图中选择号码时调用该号码。当具有此警报的ViewContoller被解除时,EXC_BAD_ACCESS即将进入。
仅在触发警报时才会发生。如果仅在没有选择的情况下查看表,则不会。这告诉我这个UIAlertView做错了。可能与内存管理和发布我不应该做的事情有关。
我哪里错了?
phoneAlert = [[[UIAlertView alloc] initWithTitle:locationName message:displayNumber delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call",nil] autorelease];
[phoneAlert show];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@",dialNumber]]];
}
}
- (void)dealloc {
[locations release];
[location release];
[dialNumber release];
[phoneAlert release];
[super dealloc];
}
答案 0 :(得分:3)
您要将phoneAlert
分配给自动释放的 UIAlertView
,由于您没有使用点语法或setter方法,因此您的实例未保留该{1}}正在做直接任务。
因此,如果您将phoneAlert
定义为具有retain
关键字的属性,那么您应该这样做以获得所需的结果:
self.phoneAlert = ...
或
[self setPhoneAlert:...];
否则,您将在EXC_BAD_ACCESS
方法中获得dealloc
,因为您autorelease
了警报视图,因此实例已由自动释放池释放。启用项目中的僵尸以查看此操作。