iOS 5,ARC:UIAlertView在@catch块中不起作用

时间:2012-07-07 22:25:42

标签: iphone ios cocoa-touch uialertview

-(IBAction)showCountryInfo:(id)sender
{
@try 
{
    CountryProperties *countryProperties=[self.storyboard instantiateViewControllerWithIdentifier:@"Culture"];
    countryProperties.countryID=self.countryID;
    countryProperties.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self.navigationController presentModalViewController:countryProperties animated:YES];
}
@catch (NSException *exception) 
{
    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Sorry" message:@"Module under revision" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
    [alert show];
} 
}

我希望从这段代码中只显示一个alertView,用户按下“Dismiss”按钮后,alertView就会消失。就这样。无论如何,警报视图不起作用。如果发生异常,则会显示警报视图,但是当我按下“关闭”按钮时,没有任何反应,程序冻结仍然存在。

是不是因为我在@catch块里面使用了我的alertView或类似的东西?

提前完成。

2 个答案:

答案 0 :(得分:1)

@try内部究竟是什么抛出异常? Objective-C中的异常处理通常不赞成进行错误处理。 Objective-C Programming Language docs说:

  

Objective-C中的例外是资源密集型的。你不应该使用   一般流量控制的例外,或仅仅表示错误。   相反,您应该使用方法或函数的返回值   表示发生了错误,并提供有关的错误信息   错误对象中的问题。

Exception Programming Topics指南有类似的观点:

  

重要您应该保留使用例外编程或   意外的运行时错误,例如越界集合访问,   试图改变不可变对象,发送无效消息,以及   失去与窗口服务器的连接。你经常照顾   当应用程序存在时,这些类型的错误和异常   创建而不是在运行时。

Error Handling Programming Guide也很好读。

答案 1 :(得分:0)

主线程上必须发生很多绘图事情。如果您将警报视图代码移动到自己的方法,并在@catch中调用,您可能会找到答案:

[self performSelectorOnMainThread:@selector(myAlertMethod) withObject:nil waitUntilDone:NO];

...其中myAlertMethod是您将警报代码移动到的方法。