当我尝试从其超级视图中删除以前存储在NSMutableArray中的UIView时,出现了EXC_BAD_ACCESS错误。这是我正在使用的代码:

int transRemoveIdx = -1;
for(int i = 0; i < [transparentTiles count]; i++){
    UIView *transparentView = [transparentTiles objectAtIndex:i];
    int transparentViewX = transparentView.frame.origin.x;
    int transparentViewY = transparentView.frame.origin.y;
    NSLog(@"Transparent X: %d Transparent Y: %d", transparentViewX, transparentViewY);

    if(transparentViewX == x && transparentViewY == y && !solid){
        [[transparentTiles objectAtIndex:i] removeFromSuperview];
        transRemoveIdx = i;
        break;
    }
}
if(transRemoveIdx != -1){
    [transparentTiles removeObjectAtIndex:transRemoveIdx];
}


if(solid){
    [solidTiles addObject:newView];
}else{
    NSLog(@"Adding Tile: %d", tileId);
    [transparentTiles addObject:newView];
}

[mapScroll addSubview:newView];
[mapScroll sendSubviewToBack:newView];


这是transparentTiles的初始化:

transparentTiles = [[NSMutableArray alloc] init];


这将检查是否已将瓷砖放置在我要放置的位置,如果已放置,它将删除旧瓷砖以为新瓷砖留出空间。或至少是我要执行的操作,但是我收到EXC_BAD_ACCESS错误,大约是调用[[transparentTiles objectAtIndex:i] removeFromSuperview];的一半时间。

我不知道什么时候会发生,这似乎是完全随机的。有什么方法可以确保不再发生这种情况?任何帮助将不胜感激,谢谢!

更新:

我发现导致该问题的唯一代码是removeFromSuperview代码。如果我要更换线

[[transparentTiles objectAtIndex:i] removeFromSuperview];




[[transparentTiles objectAtIndex:i] setAlpha:0.0f];


那么一切都完美。我不确定为什么removeFromSuperview会引起EXC_BAD_ACCESS调用,但是我目前正在将图块的Alpha设置为空,因此它消失了,基本上完成了我想做的事情。有人知道为什么调用removeFromSuperview会导致此错误吗?

最佳答案

从您发布的代码中看来,您一直在添加图块,但从未删除过它们。
所以同一视图可以在transparentTiles数组中出现n次,从而导致n次调用removeFromSuperview?那仍然不应该崩溃(不是没有线程),但这是1.可恶的东西

关于ios - removeFromSuperview的EXC_BAD_ACCESS错误调用NSMutableArray中的 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27453355/

10-10 23:49