1

无法弄清楚是什么导致了这里的崩溃。我枚举 aNSMutableArray并将某些对象的索引放入可变索引集中,然后尝试从数组中删除相应的对象。这是我的代码

  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.

任何想法为什么?谢谢

4

3 回答 3

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 ++;
}
于 2012-09-07T19:22:32.553 回答
1

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

我还认为您的声明index++可能会丢掉一些东西-如果您仅在找到要删除的项目时增加索引,则实际上是在删除第一个itemsToRemove.count项目,而不是要删除的实际项目的。考虑无条件地增加索引。

于 2012-09-07T19:24:38.413 回答
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类型可以通过使用块枚举方法来最小化,该方法传入当前索引。

于 2012-09-07T19:32:06.763 回答