按下按钮时UIAlertView崩溃:如何解决?

时间:2014-04-02 11:38:53

标签: ios crash uialertview exc-bad-access uialertviewdelegate

我有一个类,我实例显示如下警告视图:

- (void)showAlert
{       
  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Do you want to try again?"
                                                        message:nil
                                                       delegate:self
                                              cancelButtonTitle:@"Yes"
                                              otherButtonTitles:@"No", nil];

  [alertView show];
}

}

我需要self作为委托,因为当用户点按警报视图的按钮时,我需要调用alertView:didDismissWithButtonIndex:来执行某些操作。这通常很有效,但我不时会遇到这种情况:

SIGSEGV
UIKit-[UIAlertView(Private) modalItem:shouldDismissForButtonAtIndex:]

我想这是因为代表因任何原因被释放了,对吧?或者这是因为发布的是警报视图?我该怎么解决这个问题?我需要警报视图才能有一个代表,我正在阅读几个相关的帖子,但我找不到符合我情景的答案。

我在iOS 7.0中测试,我不知道这是否与此问题有关。

提前致谢

3 个答案:

答案 0 :(得分:3)

当代理人被释放时,您似乎点击了警告:

delegate:self

这是因为UIAlertView委托属性是赋值类型(不弱!)。 因此,您的委托可能会指向已发布的对象。

解决方案:

在dealloc方法中,您需要清除alertView的委托

- (void)dealloc
{
    _alertView.delegate = nil;
}

但在您需要制作iVar _alertView并将其用于alertViews之前

- (void)showAlert
{       
     _alertView = ...;

     [_alertView show];
}

答案 1 :(得分:0)

按如下方式更新您的代码:

- (void)showAlert {       
  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Do you want to try again?"
                                                        message:nil
                                                       delegate:self
                                              cancelButtonTitle:@"Yes"
                                              otherButtonTitles:@"No", nil];

  [alertView show];
}

由于您遗漏了nil部分的otherButtonTitles

如果您未添加nil,则会显示方法调度警告中缺少的哨兵。

答案 2 :(得分:0)

这是因为在单击按钮时释放了alertView的委托对象。我认为这是SDK的一个错误:

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate;    // weak reference

应该是:

@property(nonatomic, weak) id /*<UIAlertViewDelegate>*/ delegate;    // weak reference

解决问题:

  1. 使用关联为UIAlertView添加弱委托。
  2. swizzle init,setDelegate:delegate方法,将alertView委托设置为self,使用param委托设置第1步弱委托。
  3. 实现所有委托方法,使用弱委托提供方法。