单击UIAlertView时崩溃

时间:2012-03-07 16:17:21

标签: iphone ios uialertview

当我点击UIAletView时,收到以下错误。

alertView:clickedButtonAtIndex:]: message sent to deallocated instance 0x84c7010

这是我用过的代码。

    UIAlertView  *testAlert = [[ UIAlertView alloc]initWithTitle:messageTitle message:messageBody delegate:self cancelButtonTitle:messageClose otherButtonTitles:messageTryAgain, nil];
    testAlert.tag = 2;
    [testAlert show];
    [testAlert release];

我有委托方法

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

}

当我单击UIAlertView时,即使在控件到达委托方法之前,应用程序也会崩溃。可能是什么原因。我做错了什么?

3 个答案:

答案 0 :(得分:8)

这是“一个解决方案的黑客”。
希望它可以帮助您了解您的委托是内存问题。在self被解雇之前,delegete(在这种情况下为testAlert)会被解除分配

  // retain self to avoid crash you were experiencing earlier
UIAlertView  *testAlert = [[ UIAlertView alloc]initWithTitle:messageTitle message:messageBody delegate:[self retain] cancelButtonTitle:messageClose otherButtonTitles:messageTryAgain, nil];
testAlert.tag = 2;
[testAlert show];
[testAlert release];


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
  // release self because you've gotten past the crash
  [self release];
}

这绝不是一个优雅的解决方案,应该鼓励您进一步调试您的应用,找出为什么self过早被解除分配

答案 1 :(得分:2)

只是想知道,你能告诉我们你的.h文件吗?

如果我不得不冒险猜测,你就忘记设置你的班级作为代表回应UIAlertViews

你可能会遗漏这样的事情:

@interface MyClass : UIViewController <UIAlertViewDelegate>

答案 2 :(得分:1)

如果ARC启用UIAlertView对象而不需要释放,它会自动释放您的对象。