UIAlertView导致EXC_BAD_ACCESS

时间:2010-10-27 15:43:47

标签: iphone xcode memory-management uialertview exc-bad-access

我收到以下代码的错误。基本上,应用程序确认从表视图中选择号码时调用该号码。当具有此警报的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];
}

1 个答案:

答案 0 :(得分:3)

您要将phoneAlert分配给自动释放的 UIAlertView,由于您没有使用点语法或setter方法,因此您的实例未保留该{1}}正在做直接任务。

因此,如果您将phoneAlert定义为具有retain关键字的属性,那么您应该这样做以获得所需的结果:

self.phoneAlert = ...

[self setPhoneAlert:...];

否则,您将在EXC_BAD_ACCESS方法中获得dealloc,因为您autorelease了警报视图,因此实例已由自动释放池释放。启用项目中的僵尸以查看此操作。