' NSGenericException',原因:集合< __ NSArrayM:0x7fabb400>在被列举时被突变

时间:2015-01-23 10:28:06

标签: ios objective-c

在我的iPhone应用程序中,我正在尝试使用uicollectionView实现图像库。当< 20图像存储在画廊中工作正常但是当我存储多个图像(大于20)应用程序崩溃时。请帮助我。谢谢提前。

错误:

Terminating app due to uncaught exception 'NSGenericException', reason:          '*** Collection <__NSArrayM: 0x7fabb400> was mutated while being enumerated.'
*** First throw call stack:
(
    0   CoreFoundation                      0x042ea946 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x03660a97 objc_exception_throw + 44
    2   CoreFoundation                      0x042ea1e6 __NSFastEnumerationMutationHandler + 166
    3   CoreFoundation                      0x041da052 -[NSArray containsObject:] + 178
    4   AtSceneDebug                        0x001ce9a9 -[GalleryCollectionViewController loadImageFromAppSupport:] + 201
    5   AtSceneDebug                        0x001c5de2 __73-[GalleryCollectionViewController collectionView:cellForItemAtIndexPath:]_block_invoke + 98
    6   libdispatch.dylib                   0x03cca30a _dispatch_call_block_and_release + 15
    7   libdispatch.dylib                   0x03ceae2f _dispatch_client_callout + 14
    8   libdispatch.dylib                   0x03cd310f _dispatch_root_queue_drain + 634
    9   libdispatch.dylib                   0x03cd487e _dispatch_worker_thread2 + 45
    10  libsystem_pthread.dylib             0x04056dab _pthread_wqthread + 336
    11  libsystem_pthread.dylib             0x0405acce start_wqthread + 30
)
libc++abi.dylib: terminating with uncaught exception of type NSException

代码:

GalleryCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"GalleryCollectionViewCellID" forIndexPath:indexPath];

    if(indexPath.row==0)
    {
        Photo *photo=[self.photoSource.photos objectAtIndex:indexPath.row];
        cell.selectionImageView.hidden=YES;
        [cell.galleryImageView setImage:[UIImage imageNamed:[photo.mURLLarge lastPathComponent]]];
        return cell;
    }

    Photo *photo=[self.photoSource.photos objectAtIndex:indexPath.row];

    if(self.mItemType==ITEM_TYPE_PHOTO)

    {
        NSLog(@"index of coll.......%d",indexPath.row);
        UIImage *image = [_imageCache objectForKey:photo.mURLThumb];
      if(image)
        {
           //[cell.galleryImageView setImage:[self loadImageFromAppSupport:photo.mURLLarge]];
          [cell.galleryImageView setImage:image];

        }
      else
      {        
         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{          
              UIImage *image = [self loadImageFromAppSupport:photo.mURLThumb];
              if(image)
              {
                  dispatch_async(dispatch_get_main_queue(), ^{
                      GalleryCollectionViewCell *cell =(GalleryCollectionViewCell*)[self.collectionView cellForItemAtIndexPath:indexPath];
                      if(cell)
                      {
                          cell.galleryImageView.image = image;
                      }
                  });

                  [_imageCache setObject:image forKey:photo.mURLThumb];
              }
          });

      }
    }

    else

    {
        [cell.galleryImageView setImage:[self loadImageFromAppSupport:photo.mURLThumb]];

    }

    if(indexPath.row==0)
    {
        cell.selectionImageView.hidden=YES;
    }
    else if(self.isEditing && photo.isMarkedForDeletion && indexPath.row!=0)
    {
        cell.selectionImageView.hidden=NO;
        [cell.selectionImageView setImage:[UIImage imageNamed:@"red_led"]];
    }
    else if (self.isEditing && !photo.isMarkedForDeletion && indexPath.row!=0)
    {
        //[cell.selectionImageView setImage:[UIImage imageNamed:@"green_led"]];
        cell.selectionImageView.hidden=YES;
    }
    else if(!self.isEditing && photo.isMarkedForDeletion && indexPath.row!=0)
    {
        cell.selectionImageView.hidden=YES;
    }
    else if(!self.isEditing && !photo.isMarkedForDeletion && indexPath.row!=0)
    {
        cell.selectionImageView.hidden=YES;
    }

    if (!self.isEditing)
    {
        CGFloat xx=cell.frame.origin.x;
        CGFloat yy=cell.frame.origin.y;

        CGRect frame = cell.frame;
        frame.origin.x = 500; // new x coordinate
        frame.origin.y = 0; // new y coordinate
        cell.frame = frame;

                [UIView animateWithDuration:0.0 animations:^{

            CGRect frame = cell.frame;
            frame.origin.x = xx; // new x coordinate
            frame.origin.y = yy; // new y coordinate
            cell.frame = frame;
        }];

    }
    cell.layer.shouldRasterize = YES;
    cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
    return cell;

1 个答案:

答案 0 :(得分:14)

当您在2个不同的线程/队列上使用NSMutable时,通常会抛出此错误,其中一个是枚举一个而另一个是从中添加/删除元素。 永远不要在多线程环境中使用NSMutableObject。 你的电话:

[_imageCache setObject:image forKey:photo.mURLThumb];

是失败的原因,您在主线程中访问它时正在调度队列中更改可变对象。将此调用移到“if(cell)”部分上方(或dispatch_get_main_queue块中的任何其他位置)将解决它。