2

重複の可能性:
列挙中に目的の C NSMutableArray が変更されましたか?

このコードを使用して、インデックスのオブジェクトを削除します。

-(IBAction)deleteMessage:(id)sender{

UIButton *button = (UIButton*) sender;

for (UIImageView *imageView in imageArray) 
{

    if ([imageView isKindOfClass:[UIImageView class]] && imageView.tag == button.tag)
    {

        if (imageView.frame.size.height == 60) {
            x = 60;
        }

        if (imageView.frame.size.height == 200) {
            x = 200;
        }

        for (UITextView *text in messagetext) 
        {

            for (UITextView *name in messagename) 
            {

                if ([text isKindOfClass:[UITextView class]] && text.tag == button.tag && text.tag== name.tag)
                {

        [imageView removeFromSuperview];

                    [messagename removeObjectAtIndex:button.tag - 1];
                    [messagetext removeObjectAtIndex:button.tag - 1];

                 }
         }

 }

エラーは次のとおりです。

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x704bdb0> was mutated while being enumerated.'

ただし、最初に配列の最後のオブジェクトを削除し、最後から最初に順番に移動すると、機能することに気付きました。しかし、最後ではないインデックスでオブジェクトを削除しようとすると、アプリがクラッシュして次のエラーが表示されます: (1,2,3,4..I delete object2... crash...if I delete object 4 noクラッシュ)

4

3 に答える 3

7

これを行う 1 つの方法は、削除するインデックスを含む配列を作成し、ループを実行してインデックスを追加し、後でオブジェクトを削除することです。このようなもの:

NSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init];

// Inside your loop
[indexes addIndex:(button.tag - 1)];

//..

// After your loop
[messagename removeObjectsAtIndexes:indexes];
[messagetext removeObjectsAtIndexes:indexes];

両方の配列に異なるインデックスが必要な場合は、別の配列を作成しNSMutableIndexSet、それに 2 番目のインデックス セットを追加します。indexesまた、ARC を使用しない場合はリリースすることを忘れないでください。

于 2012-07-12T17:58:46.590 に答える
1

配列にオブジェクトを挿入または削除する場合、配列に対して "for x in y" 反復を使用することはできません。古き良き配列を使用するか、削除するオブジェクトへの参照を保持してから後で削除することができます。

NSObject *messageNameToRemove;
NSObject *messageTextToRemove; 
for (UITextView *text in messagetext) 
        {
        for (UITextView *name in messagename) 
        {

            if ([text isKindOfClass:[UITextView class]] && text.tag == button.tag && text.tag== name.tag)
            {

               [imageView removeFromSuperview];
               messageNameToRemove = [messagename objectAtIndex:button.tag -1];
               messageTextToRemove = [messagetext objectAtIndex:button.tag -1];
            }
         }

[messagename removeObject:messageNameToRemove];
[messagetext removeObject:messageTextToRemove];
于 2012-07-12T17:50:27.080 に答える
1

配列を変更する (つまり、要素を削除する) 予定がある場合、配列に "for each" スタイルの反復を使用することはできません。配列を反復するときに配列から要素を本当に削除したい場合は、「古いスタイル」の反復を使用する必要があります。ここにある別のスタック オーバーフローの投稿では、配列を変更できる古いスタイルの使用方法をうまく説明しています。

于 2012-07-12T17:44:16.073 に答える