-1

以下是在视图控制器中显示警报的代码

-(void)saveProducts {
    pData = [[JsonModel sharedJsonModel] prodData];
    if ([pData count] == 0 && [self respondsToSelector:@selector(alertView:clickedButtonAtIndex:) ]  ) {
        alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"No products against this category" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
    }


    [self.tblView reloadData];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

    if (buttonIndex == 0) {
        [self.navigationController popViewControllerAnimated:YES];
        [actInd stopAnimating];
    }

}

但是在慢速网络中,警报会慢慢来。如果我们同时点击导航栏的后退按钮,弹出导航控制器并在新的视图控制器中显示警报。但是当我点击确定时,应用程序突然崩溃并出现 EXC_BAD_ACCESS 错误。我也试过

didDismissWithButtonIndex

函数代替

clickedButtonAtIndex

但是会发生同样的错误。请帮我

如果我们没有点击返回栏按钮,它可以正常工作。仅当第一个视图控制器警报显示在第二个视图控制器中时才会出现问题

编辑 这是错误报告 * -[ProductsListing alertView:didDismissWithButtonIndex:]: message sent to deallocated instance 0x8478280

编辑 我理解这个问题。当我单击后退按钮时,我的警报委托解除分配并委托调用结果错误。我该如何克服呢?

4

3 回答 3

2

我最好的猜测是“self.navigationController”或“actInd”已经发布。此外,您的“UIAlertView”会泄漏内存(除非您使用的是 ARC)。使用 Instruments 分析应用程序,选择“Zombies”工具并查看它的功能。

于 2013-02-12T12:34:58.730 回答
0

我相信你必须改变

[alert show];

if(self.view.window){
   [alert show];
}

这样,仅当控制器(视图)仍在屏幕上时才会显示警报。(为什么让用户从前一个屏幕看到警报?)如果您希望警报仍然出现......那么“旧”控制器必须通知“新”一个问题发生了......现在它的新控制器的工作是通知用户。

或者你可以尝试改变这部分

    [self.navigationController popViewControllerAnimated:YES];
    [actInd stopAnimating];  

if(self.view.window){
    [self.navigationController popViewControllerAnimated:YES];
    [actInd stopAnimating]; // im not sure where the animation is...so not sure if this shoulb be in here or not
}
于 2013-02-12T13:15:27.827 回答
0

从你描述的问题来看,这里可能是这个(一个疯狂的猜测)

[actInd stopAnimating];

在 viewController 被删除(弹出)后调用。actInd可能没有有效的内存,因此它崩溃

像这样更改方法内容并检查

if (buttonIndex == 0) {
        [actInd stopAnimating];
        [self.navigationController popViewControllerAnimated:YES];
    }
于 2013-02-12T12:33:11.130 回答