Iphone UIAlertView抛出EXC_BAD_ACCESS。 - 编辑,不是由UIAlertView引起的

时间:2010-11-23 16:27:26

标签: iphone exc-bad-access uiactionsheet

我不明白为什么这会给我一个EXC_BAD_ACCESS。基本背景,我收集和处理一些信息,然后使用模态视图让用户确认他是否想继续。

我在导航栏上有一个名为continue的按钮,它调用我的数据准备功能。

- (void)viewDidLoad {
    //Other stuff
    UIBarButtonItem *next = [[UIBarButtonItem alloc]
                                  initWithTitle:@"Next" 
                                  style:UIBarButtonItemStyleBordered
                                  target:self
                                  action:@selector(prepData)];
    self.navigationItem.rightBarButtonItem = next;
    [next release];
    [super viewDidLoad];
}

prepData:

-(void)prepData{
    /*
    There's a bunch of stuff going on here, if "mensaje" is not an empty NSString, there is some kind of error that wont let me go on, if not, everything in the data is fine
    */
    if(![mensaje isEqualToString:@""]){
        UIAlertView *alert = [[UIAlertView alloc] 
                              initWithTitle:nil
                              message:mensaje
                              delegate:nil 
                              cancelButtonTitle:@"Aceptar" 
                              otherButtonTitles:nil];
        [alert show];
        [alert release];
    }else{
        UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                      initWithTitle:@"¿Esta seguro que desea realizar estas operaciones?" 
                                      delegate:self 
                                      cancelButtonTitle:@"Cancelar" 
                                      destructiveButtonTitle:@"Aceptar"
                                      otherButtonTitles:nil];
        [actionSheet showInView:self.view];
        [actionSheet release];
    }
}

如果我调试,我可以完全通过prepData(),只要按下继续,我就会得到一个EXC_BAD_ACCESS。如果我注释掉[actionSheet发布];我没有得到例外,但据我所知,就像警报视图一样,行动表“一直”直到它们显示出来。

至少我读过的所有书籍都说明了这一点,但很可能我不会理解自动释放中的某些内容。

仅供参考,警报弹出正常。

有人知道这里有什么意思吗?

谢谢,Stefano。

编辑:弄清楚,上面的动作表和警报视图的代码很好,问题是我发布的东西后来试图自动释放。

我有for循环这样做:

for(someConditions){
    NSString *montoFormateado = [[[NSString alloc] initWithFormat:@"%.2lf",[monto doubleValue]] stringByReplacingOccurrencesOfString:@"." withString:@","];
                    [_postBuild setObject:[NSString stringWithString:montoFormateado] forKey:[NSString stringWithString:iidvar]];
                    [montoFormateado release];
}                            
postBuild = [_postBuild mutableCopy];
[_postBuild release];

现在,似乎错误在于通过使用[NSString strintWithString:montoFormateado]我将该字符串留待以后自动释放,但是当我释放_postBuild时该字符串也被释放,我删除了它并且刚刚使用setObject:montoFormateado及其工作正常。

它泄漏的记忆,但我认为这是一个不同的问题,exc_bad_access得到了解决。

4 个答案:

答案 0 :(得分:4)

找到此类错误的最简单方法是使用NSZombieEnabled环境变量。

当你在通话结束时得到一个EXC_BAD_ACCESS时,通常意味着某些东西正在被自动释放,但是你释放它时它的保留计数已经是0。

检查this post,它会挽救你的生命很多次。如果这不起作用,请发表评论,我们将重新调试我们的调试上限:)

答案 1 :(得分:1)

我认为在你没有展示的代码中有一个版本太多了(在“这里有很多东西,如果”menaje“不是一个空的NSString”块)。

您的actionSheet代码没有任何问题。如你所说,一旦它不再在屏幕上,它应该解除分配。但是如果你过度释放了self.view的一个子视图,那么当自动释放池耗尽时它可能会导致崩溃。

答案 2 :(得分:-1)

也许你在使用它之前发布了UIAlertView,尝试删除发布语句并将UIAlertView声明为自动发布(虽然它应该没问题)

   if(![mensaje isEqualToString:@""]){
        UIAlertView *alert = [[UIAlertView alloc] 
                              initWithTitle:nil
                              message:mensaje
                              delegate:nil 
                              cancelButtonTitle:@"Aceptar" 
                              otherButtonTitles:nil] autorelease];
        [alert show];

另一件事可能是你在某些回电或其他东西上再次释放这些家伙,你应该检查你不是这样做的,就像我上面说的海报一样,你可以用僵尸把这些东西当成好。

答案 3 :(得分:-1)

在这两种情况下,如果你要“释放”,你最好先“保留”。

对于UIActionSheet - 我相信传递给showInView的视图会保留动作表的副本。

在AlertView中,情况并非如此。