1

我不明白为什么这给了我一个 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];
}

准备数据:

-(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 release];我没有得到例外,但据我所知,就像警报视图一样,操作表“一直存在”直到它们显示出来。

至少我读过的所有书籍都这样说,但很可能我不理解自动发布中的某些内容。

仅供参考,弹出警报就好了。

有人知道这里发生了什么吗?

谢谢,斯特凡诺。

编辑:想通了,上面的操作表和警报视图的代码很好,问题是我正在发布一些后来试图自动发布的东西。

我有执行此操作的 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

4 回答 4

4

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

当您在通话结束时收到 EXC_BAD_ACCESS 时,通常意味着正在自动释放某些东西,但它的保留计数在您释放它时已经为 0。

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

于 2010-11-23T16:33:23.963 回答
1

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

您的 actionSheet 代码没有任何问题。正如您所说,一旦不再出现在屏幕上,它就应该自行释放。但是,如果您过度释放其中一个子视图,self.view则可能会在自动释放池耗尽时导致崩溃。

于 2010-11-23T16:41:03.903 回答
-1

也许您在使用之前发布 UIAlertView,尝试删除发布声明并将 UIAlertView 声明为自动发布(尽管它应该没问题)

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

另一件事可能是你在一些回调或什么的时候再次释放这些家伙,你应该检查你没有这样做,就像我上面的海报所说的那样,你也可以使用僵尸来解决这些问题。

于 2010-11-23T16:33:07.247 回答
-1

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

在 UIActionSheet 的情况下 - 我相信传递给 showInView 的视图保留了操作表的副本。

在 AlertView 中,情况并非如此。

于 2010-11-23T16:37:55.690 回答