在iOS6中,UIAlertView出现EXC_BAD_ACCESS code 2错误

43

我正在尝试找出我的应用程序为什么会崩溃。

在运行ios5.1模拟器的Xcode 4.4中,它完美地工作,但是当我切换到Xcode 4.5和ios6时,我收到了一个EXC_BAD_ACCESS代码2的错误。这是我的代码:

- (void) myMethod
{
    UIAlertView *alertview = [[[UIAlertView alloc]initWithTitle:@"Title" message:@"message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease];
    alertview.tag = 1
    [alertview show];
}

[UIAlertView show]这一行代码上,我收到了一个EXC_BAD_ACCESS代码2。

有任何想法吗?

谢谢!

2个回答

127

我明白了。

我也遇到了相同的问题,对于我的情况来说,似乎该方法现在是从后台抛出的(现在在iOS7中,而在iOS6中,像@nodepond所说,UIAlertView会自动放入主线程 - 谢谢!)。

尝试确保该方法是从主线程显示的:

[alertView performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];

祝你好运!


3
我只想补充一点,当应用程序启动时,如果用户返回主屏幕并再次打开应用程序,弹出警告视图将导致崩溃。按照Eva的建议执行performSelectorOnMainThread...将解决此问题。 - Tommy
1
我认为这在iOS6.0中已经改变了。在此之前,UIAlertView会自动放入主线程中。 - nodepond
我给了+1,因为这正是我想要的,但出现这种问题的主要原因是多线程,在你在一个不是主线程的单独线程上执行某些操作时,在该线程中访问或修改GUI,因为GUI功能只能在主线程上工作。 - umer sufyan
谢谢你的回答,我之前很困惑为什么它在OS7+上运行良好但在6上崩溃了。 - Yonathan Jm

0

这种情况我也遇到过,甚至在2014年也遇到过。

问题在于想要使用一个已经释放的对象。

我做错了什么:

//class B with UIAletViewDelegate

-(void) showAlert{
 UIAlertView * alert = [[UIAlertView alloc] initWithTitle bla bla...];
 [alert show];
}


//class A
viewDidLoad{
 MyClassB *B = [[B alloc] init];
 [B showAlert];
}

什么是正确的方式:

//Class A
@implementation A{
    ClassB *B;
}

 viewDidLoad{
     B = [[B alloc] init];
     [B showAlert];
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接