【问题标题】:UIAlertView is causing a EXC_BAD_ACCESSUIAlertView 导致 EXC_BAD_ACCESS
【发布时间】:2010-10-27 15:43:46
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

您正在将 phoneAlert 分配给 autoreleased UIAlertView,因为您没有使用点语法或 setter 方法,所以您的实例不会保留该 UIAlertView,而是直接执行任务。

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

self.phoneAlert = ...

[self setPhoneAlert:...];

否则你会在你的dealloc 方法中得到EXC_BAD_ACCESS,因为你autoreleased 警报视图,所以实例被自动释放池释放。在您的项目中打开僵尸以查看此操作。

【讨论】:

  • 好的,感谢您的帮助。实际上,我回过头来意识到我正在使它变得比实际需要的复杂得多。特别是对于一个确认消息。我应该更频繁地这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2016-11-19
  • 2012-10-02
  • 2011-04-14
相关资源
最近更新 更多