UIImagePickerController - Collection mutated while being enumerated
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.
精彩评论