1

ここでクラッシュの原因を突き止めることはできません。を列挙し、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.

なぜアイデアはありますか?ありがとう

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 に答える