开发者

UIImagePickerController - Collection mutated while being enumerated

开发者 https://www.devze.com 2023-04-11 18:12 出处:网络
My iPad app crashes when you scroll the UIImagePickerController popover, either the PhotoLibrary or PhotosAlbum variety.I have about 130 images in the album and the crash occurs when you scroll the li

My iPad app crashes when you scroll the UIImagePickerController popover, either the PhotoLibrary or PhotosAlbum variety. I have about 130 images in the album and the crash occurs when you scroll the list to bring additional thumbnails into view. I found some other mentions of UIImagePicker issues in the simulator in iOS 2.x here, but that does not seem relevant. Here's the crash report:

2011-10-07 11:18:17.309 Experiences[1419:707] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x343fe0> was mutated while being enumerated.(
    "<PLImageTableSegment: 0x343fc0>",
    "<null>",
    "<null>",
    "<PLImageTableSegment: 0x343fc0>",
    "<PLImageTableSegment: 0x343fc0>",
    "<PLImageTableSegment: 0x343fc0>",
    "<PLImageTableSegment: 0x343fc0>",
    "<PLImageTableSegment: 0x343fc0>",
    "<PLImageTableSegmen开发者_如何学JAVAt: 0x343fc0>",
    "<PLImageTableSegment: 0x343fc0>",
    "<PLImageTableSegment: 0x343fc0>",
    "<PLImageTableSegment: 0x343fc0>"
)'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x319b864f __exceptionPreprocess + 114
    1   libobjc.A.dylib                     0x34af4c5d objc_exception_throw + 24
2   CoreFoundation                      0x319b7edf __NSFastEnumerationMutationHandler   + 214
    3   libobjc.A.dylib                     0x34afb36d objc_enumerationMutation + 24
    4   CoreFoundation                      0x31922b9d -[__NSArrayM dealloc] + 80
5   CoreFoundation                      0x3191cc43 -[NSObject(NSObject) release] + 30
6   PhotoLibrary                        0x3733ba81 +[PLImageTable releaseSegmentCache] + 20
7   PhotoLibrary                        0x3732a4ed -[PLPhotoLibrary dealloc] + 116
8   CoreFoundation                      0x3191cc43 -[NSObject(NSObject) release] + 30
9   CoreFoundation                      0x3191d1a1 CFRelease + 68
10  CoreFoundation                      0x3191febb _CFAutoreleasePoolPop + 146
11  Foundation                          0x30efe1cb -[NSAutoreleasePool release] + 98
12  UIKit                               0x36f0ff0f _UIApplicationHandleEvent + 5790
13  GraphicsServices                    0x35a10e77 PurpleEventCallback + 666
14  CoreFoundation                      0x3198fa97 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26
15  CoreFoundation                      0x3199183f __CFRunLoopDoSource1 + 166
16  CoreFoundation                      0x3199260d __CFRunLoopRun + 520
17  CoreFoundation                      0x31922ec3 CFRunLoopRunSpecific + 230
18  CoreFoundation                      0x31922dcb CFRunLoopRunInMode + 58
19  GraphicsServices                    0x35a1041f GSEventRunModal + 114
20  GraphicsServices                    0x35a104cb GSEventRun + 62
21  UIKit                               0x36f3ad69 -[UIApplication _run] + 404
22  UIKit                               0x36f38807 UIApplicationMain + 670
23  Experiences                         0x00002e77 main + 82
24  Experiences                         0x00002e20 start + 40
)
terminate called after throwing an instance of 'NSException'

And here's the code that invokes the UIImagePickerController popover:

- (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType
{
    if ([self.cameraPopoverViewController isPopoverVisible]) {
        DLog(@"requesting cameraPopover dismissal");
        [self.cameraPopoverViewController dismissPopoverAnimated:YES];
    }

    // Set up the imagePicker common parameters
    UIImagePickerController* imagePicker    = [[UIImagePickerController alloc] init];
    imagePicker.delegate                    = self;
    imagePicker.mediaTypes                  = [NSArray arrayWithObjects:(NSString *) kUTTypeImage, nil];
    imagePicker.allowsEditing               = YES;
    imagePicker.sourceType                  = sourceType;
    DLog(@"imagePicker %@", imagePicker);

    self.newMedia = NO;

    switch (imagePicker.sourceType) {
        case UIImagePickerControllerSourceTypeCamera: {
            [self presentModalViewController:imagePicker
                                    animated:YES];
            self.newMedia = YES;
            break;
        }
        case UIImagePickerControllerSourceTypePhotoLibrary: 
            // These two cases are identical, just fall through into PhotosAlbum case...
        case UIImagePickerControllerSourceTypeSavedPhotosAlbum: {
            if (self.pickerPopoverViewController) {
                // Should never occur if pickers are getting dismissed properly...
                ALog(@"had a stranded pickerPopover!");
                self.pickerPopoverViewController = nil;
            }
            pickerPopoverViewController = [[UIPopoverController alloc] initWithContentViewController:imagePicker];
            // Set up the rect from which the popover should hang
            CGRect popoverRect = [cameraBtn convertRect:cameraBtn.bounds
                                                 toView:self.view];
            // ...and display the popover "hanging" from the cameraBtn
            [self.pickerPopoverViewController presentPopoverFromRect:popoverRect
                                                              inView:self.view 
                                            permittedArrowDirections:UIPopoverArrowDirectionUp
                                                            animated:YES];            
            break;
        }

        default:
            break;
    }
    [imagePicker release];
}

It looks to me like some of the image/imageThumbnails are getting deallocated, (and hence mutating the collection). But I don't know what to do about it...


I just encountered similar problem. By trial and error, I found out that if you use UIImagePickerControllerSourceTypePhotoLibrary as the imagepicker's source type, it will work ok. But using UIImagePickerControllerSourceTypeSavedPhotosAlbum will crash the app.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号