removeObjectsAtIndexes导致崩溃

时间:2012-09-07 19:19:50

标签: ios nsmutablearray nsarray nsindexset

无法弄清楚造成这次崩溃的原因。我枚举NSMutableArray并将某些对象的索引放入可变索引集,然后尝试从数组中删除相应的对象。这是我的代码

  NSMutableIndexSet *itemsToRemove;

UIBarButtonItem *item;
NSUInteger index;

for (item in self.rightView.toolbarItems)
{
    if (item.tag == MLPAD_RIGHT_VC_BACK_TO_CENTRAL_ITEM_TAG){
        [itemsToRemove addIndex:index];
        index ++;
    }
}

[self.rightView.toolbarItems removeObjectsAtIndexes:itemsToRemove];

最后一行崩溃并给我一个EX_BAD_ACCESS

任何想法为什么? 感谢

3 个答案:

答案 0 :(得分:2)

你没有分配/初始化itemsToRemove - 如果你正在使用ARC,它被初始化为nil,如果没有,它可能包含垃圾 - 如果你想让它成为可接受的话后来作为一个论点传递......

您也没有将index初始化为零...

(为什么我怀疑你是来自托管语言?...)

与崩溃无关,但它仍然是语义错误:即使未满足该条件,您也必须增加index

for (item in self.rightView.toolbarItems)
{
    if (item.tag == MLPAD_RIGHT_VC_BACK_TO_CENTRAL_ITEM_TAG) {
        [itemsToRemove addIndex:index];
    }
    index ++;
}

答案 1 :(得分:1)

您的主要问题是itemsToRemove永远不会被初始化。您不能将对象添加到不是NSMutableIndexSet的NSMutableIndexSet - 尝试设置itemsToRemove = [[NSMutableIndexSet alloc] init]或类似。

我也认为你在哪里声明index++可能会抛出一些东西 - 如果你只是在找到要删除的项目时增加索引,那么你实际上是删除了第一个{{1} } items,而不是你想要摆脱的实际项目。考虑无条件地增加索引。

答案 2 :(得分:0)

你有几个问题。不分配itemsToRemove,不初始化index(内置堆栈变量不会自动初始化),也不会在每次循环迭代时递增index

NSMutableIndexSet *itemsToRemove = [NSMutableIndexSet new];
NSUInteger index = 0;

for (UIBarButtonItem *item in self.rightView.toolbarItems)
{
    if (item.tag == MLPAD_RIGHT_VC_BACK_TO_CENTRAL_ITEM_TAG){
       [itemsToRemove addIndex:index];
    }
    ++index;
}

[self.rightView.toolbarItems removeObjectsAtIndexes:itemsToRemove];

使用块枚举方法可以最小化index类型的错误,该方法传入当前索引。