2

可能重复:
Objective-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

一种方法是使用要删除的索引创建一个数组,然后执行循环,添加索引并随后删除对象。像这样的东西:

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

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

//..

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

现在,如果您想要两个数组的不同索引,只需创建另一个NSMutableIndexSet并添加第二组索引即可。indexes如果你不使用 ARC,也不要忘记释放。

于 2012-07-12T17:58:46.590 回答
1

如果您打算对数组进行变异(即删除元素),则不能在数组上使用“for each”样式迭代,因为它会干扰迭代。如果您真的想在迭代时从数组中删除一个元素,则需要使用“旧样式”迭代。此处的另一个 Stack Overflow 帖子很好地展示了如何使用允许您对数组进行变异的旧样式。

于 2012-07-12T17:44:16.073 回答
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 回答