UIAlertView退出EXC_BAD_ACCESS错误

时间:2010-11-18 07:36:52

标签: iphone uialertview exc-bad-access

我有这样的错误:当我点击navigationbar.backItemButton我用两个按钮显示UIAlertView。当我按下其中任何一个时,应用程序终止只有EXC_BAD_ACCESS。方法 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex :( NSInteger)buttonIndex不调用。我该如何解决?感谢名单!

// h - file

@interface DetailsTableViewController : UITableViewController <UITextFieldDelegate, UIAlertViewDelegate>

// m - file

- (void)viewWillDisappear:(BOOL)animated
{
    //if changes unsaved - alert reask window
    if (isDirty)
    {
        UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Save changes?"  
                                                      message:@"Press YES if you want to save changes before exit, NO - other case."  
                                                     delegate: self  
                                                    cancelButtonTitle: @"NO"  
                                                    otherButtonTitles: @"YES", nil];   

        [message show];  

        [message autorelease];
    }   
}

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *title = [alertView buttonTitleAtIndex: buttonIndex];  

    if([title isEqualToString: @"YES"])  
    {  
        [self saveBtnUserClick];    
    } 
}

5 个答案:

答案 0 :(得分:3)

我认为问题在于,在您点击后退按钮后,您的当前控制器将从导航堆栈中删除并取消分配,因此当警报尝试调用其委托方法时,它会在解除分配的对象上调用它们,从而导致EXC_BAD_ACCESS错误。为了解决这个问题,我看到了两个明显的选择(虽然可能有更好的解决方案):

  1. 额外保留您的控制器某处(在以前的控制器中可能是),但是您需要找到在完成后释放它的方法。
  2. 创建自定义按钮而不是标准“后退”,并在点按时显示提醒。然后在alert的委托方法中从导航堆栈中弹出当前控制器。

答案 1 :(得分:2)

尝试将委托更改为nil而不是self。它解决了我的问题。

答案 2 :(得分:1)

您的视图控制器是否实现了UIAlertViewDelegate?如果没有,请在{starts。

之前添加接口声明

还可以在clickedButtonAtIndex方法中尝试NSLogging并打印buttonIndex值并查看控制台。

编辑:再次阅读你的帖子,我猜你确实错过了你的界面声明中的UIAlertViewDelegate。

答案 3 :(得分:1)

可能[消息自动释放]; 你错了用吗? [消息发布];

因为你已经使用了[[UIAlertView alloc] init .....];因为你应该释放记忆。

autorelease是一种适用于内存依赖于编译器的结构或者您没有手动提供内存的结构。

享受。

答案 4 :(得分:0)

&#34;尝试将委托更改为nil而不是self。它解决了我的问题。&#34;为我工作。感谢名单