使用 UIImagePickerController 访问相册时应用崩溃

Posted

技术标签:

【中文标题】使用 UIImagePickerController 访问相册时应用崩溃【英文标题】:App crashes when using UIImagePickerController to access album 【发布时间】:2012-04-07 15:11:12 【问题描述】:

iTunes Connect 有我的应用程序的崩溃报告。它说当我使用UIImagePickerController 访问相册时应用程序会崩溃,但我无法在模拟器或真机上重现该问题。以下是崩溃报告的内容。请帮我查明问题。

Hardware Model:      iPhone4,1
Process:         eyerecolor [5011]
Path:            /var/mobile/Applications/B9D7CEA3-DB1D-4CE3-B605-90EC066B7C92/eyerecolor.app/eyerecolor
Identifier:      eyerecolor
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]


Date/Time:       2012-04-06 18:51:37.692 -0500
OS Version:      iPhone OS 5.0 (9A334)
Report Version:  104


Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0


Last Exception Backtrace:
0   CoreFoundation                 0x371198bf __exceptionPreprocess + 163

1   libobjc.A.dylib                0x324891e5 objc_exception_throw + 33

2   CoreData                       0x3728c64b -[NSPersistentStoreCoordinator setMetadata:forPersistentStore:] + 411

3   PhotoLibraryServices           0x31585ffd +[PLManagedObjectContext(Private) recordVersion:forStore:] + 393

4   PhotoLibraryServices           0x31586385 +[PLManagedObjectContext(Private) configurePersistentStoreCoordinator:] + 897

5   PhotoLibraryServices           0x3158691f __69+[PLManagedObjectContext(Protected) sharedPersistentStoreCoordinator]_block_invoke_0323 + 179

6   libdispatch.dylib              0x32a908cf _dispatch_barrier_sync_f_invoke + 27

7   libdispatch.dylib              0x32a9072f dispatch_barrier_sync_f$VARIANT$mp + 63

8   libdispatch.dylib              0x32a9034f dispatch_sync_f$VARIANT$mp + 19

9   libdispatch.dylib              0x32a909f9 dispatch_sync$VARIANT$mp + 33

10  PhotoLibraryServices           0x3158681f +[PLManagedObjectContext(Protected) sharedPersistentStoreCoordinator] + 155

11  PhotoLibraryServices           0x315853c9 -[PLManagedObjectContext initWithConcurrencyType:useSharedPersistentStoreCoordinator:] + 121

12  PhotoLibraryServices           0x315852a7 +[PLManagedObjectContext contextForPhotoLibrary:] + 115

13  PhotoLibraryServices           0x31584ec9 -[PLPhotoLibrary(Protected) loadDatabase] + 237

14  PhotoLibraryServices           0x3154d87d -[PLPhotoLibrary initWithPath:canTriggerDatabaseUpdate:] + 305

15  PhotoLibraryServices           0x315942a1 __42+[PLSharedPhotoLibrary sharedPhotoLibrary]_block_invoke_0 + 61

16  libdispatch.dylib              0x32a92683 dispatch_once_f$VARIANT$mp + 47

17  PhotoLibraryServices           0x3159425f +[PLSharedPhotoLibrary sharedPhotoLibrary] + 83

18  PhotoLibrary                   0x32c69bc9 -[PLUILibraryViewController _updateFilteredAlbumListWithFilter:] + 157

19  PhotoLibrary                   0x32c6961b -[PLUILibraryViewController init] + 67

20  UIKit                          0x31f58cc5 -[UIImagePickerController _createInitialController] + 317

21  UIKit                          0x31f58d05 -[UIImagePickerController _setupControllersForCurrentSourceType] + 25

22  UIKit                          0x31f58711 -[UIImagePickerController viewWillAppear:] + 69

23  UIKit                          0x31d336b5 -[UIViewController _setViewAppearState:isAnimating:] + 145

24  UIKit                          0x31d8e61b -[UIViewController beginAppearanceTransition:animated:] + 191

25  UIKit                          0x31dd4691 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 4077

26  UIKit                          0x31dd314f -[UIViewController presentViewController:withTransition:completion:] + 3123

27  UIKit                          0x044f2e93 -[UIViewControllerAccessibility(SafeCategory) presentViewController:animated:completion:] + 51

28  UIKit                          0x31e2dd97 -[UIViewController presentModalViewController:animated:] + 31

29  eyerecolor                     0x00009c39 -[eyerecolorViewController showImagePicker:] (eyerecolorViewController.m:1855)

- (void)showImagePicker:(UIImagePickerControllerSourceType)sourceType

    if ([UIImagePickerController isSourceTypeAvailable:sourceType]) 
        self.m_pickerView.sourceType = sourceType;
        self.m_pickerView.allowsEditing = NO;
        [self presentModalViewController:self.m_pickerView animated:YES];
    


- (void)viewDidLoad

    if (self.m_pickerView == nil) 
        self.m_pickerView = [[[UIImagePickerController alloc] init] autorelease];
        self.m_pickerView.delegate = self;
        self.m_pickerView.allowsImageEditing = NO;
    

【问题讨论】:

你能展示一下你用来调用 UIImagePicker 控制器的代码吗? 好的,这里是代码 - (void)showImagePicker:(UIImagePickerControllerSourceType)sourceType if ([UIImagePickerController isSourceTypeAvailable:sourceType]) self.m_pickerView.sourceType = sourceType; self.m_pickerView.allowsEditing = 否; [self presentModalViewController:self.m_pickerView Animation:YES]; - (void)viewDidLoad if (self.m_pickerView == nil) self.m_pickerView = [[[UIImagePickerController alloc] init] autorelease]; self.m_pickerView.delegate = self; self.m_pickerView.allowsImageEditing = NO; 把代码放到你的问题中,这样它就可读了。 【参考方案1】:

好的,我想到了几件事。我希望它会工作....

首先检查你是否在你的Controller的.h文件中包含了UIImagePickerDelegate。其次,有像 didFinshPickingImage 这样的委托方法尝试在 Beppe 给你的 Class Reference 上搜索。

如果这些东西不起作用,请告诉我您的应用程序是否提供了 Sigbrt 或 Bad Excess ...根据我的经验,我相信这将是一个 sigbrt。 如果我没记错的话,你的应用程序会将你带到 main.m 文件。当然,您将无法分辨出哪里出了问题,因此请在您的应用程序中添加一个例外断点。这将为您提供您的应用程序崩溃的确切时间。

搜索那个点。我真正关心的是你的委托方法不起作用。

如果是最坏的情况,你仍然找不到解决方案,最后的手段是THIS

让我知道它是否有效:) 干杯

【讨论】:

1.Controller的.h文件已经包含了UIImagePickerDelegate。 1.Controller的.h文件已经包含了UIImagePickerDelegate。 2.这是 SIGABRT,是的,应用程序将进入 main.m 文件。现在的主要问题是我无法重现该错误,我在所有设备和所有版本(ios 3、4、5)上都尝试过,我的代码仍然运行良好。 好的,你尝试过异常断点吗......它会告诉你错误在哪里......告诉我第二次你是否尝试过我给你的链接......【参考方案2】:

我不确定这是否能解决您的问题,但希望它会有所帮助...

您是否在 iOS 5 上尝试过您的代码?你的设备呢?

查看崩溃报告,您的问题似乎与 iPhone 4S 上的 iOS 5 有关:

Hardware Model: iPhone4,1
...
OS Version: iPhone OS 5.0 (9A334)

尽量不要自动释放您的 UIImagePickerController。有时自动释放的对象会产生问题,而不是平滑内存管理。

编辑:还有一件事...... Apple 建议实现 UIImagePickerController 的方式如下:

    验证设备是否能够从 所需的来源。这样做调用 isSourceTypeAvailable: 类 方法,提供一个常数 “UIImagePickerControllerSourceType”枚举。 检查哪些媒体类型可用,对于您使用的源类型 使用,通过调用 availableMediaTypesForSourceType: 类 方法。这使您可以区分可以使用的相机 用于视频录制和只能用于静止图像的一种。 告诉图像选择器控制器根据 您希望提供的媒体类型 — 静止图像、电影或 两者——通过设置 mediaTypes 属性。 通过调用 presentViewController:animated:completion: 当前的方法 活动视图控制器,传递您配置的图像选择器 控制器作为新的视图控制器。在 iPad 上,向用户展示 使用弹出框的界面。这样做只有在 sourceType 图像选择器控制器的属性设置为 UIImagePickerControllerSourceTypeCamera。使用弹出框 控制器,请使用“Presenting and Dismissing”中描述的方法 UIPopoverController 类参考中的 Popover”。 当用户点击按钮选择新捕获或保存的图像时 或电影,或取消操作,使用关闭图像选择器 你的委托对象。对于新捕获的媒体,您的代表可以 然后将其保存到设备上的相机胶卷中。对于之前保存的 媒体,然后您的代表可以根据 应用的目的。

来自UIImagePickerController Class Reference

编辑(再次):好吧,如果您的设备没有任何问题,这很奇怪,但我再次尝试提出一种改变实际情况的方法。

在 showImagePicker:(UIImagePickerControllerSourceType)sourceType 中实现你的 UIImagePicker 控制器,而不是 viewDidLoad。

使用allowEditing 代替allowImageEditing(在iOS 3.1 中已弃用)并且不要自动释放您的对象...

【讨论】:

1.我已经在 iOS 5 上的 iPhone 4s 上尝试过,但无法重现该问题。我也在 iPad 2 和 iPod touch 4 上尝试过,仍然运行良好。我没有'不知道问题用户的环境。 2.presentViewController 仅适用于 iOS 5。

以上是关于使用 UIImagePickerController 访问相册时应用崩溃的主要内容,如果未能解决你的问题,请参考以下文章

相机相册

如何使用 iphone 中的核心数据将图像存储到 sqlite? [复制]

摄像头拍照上传

ViewController 生命周期 UINavigationController

iOS开发——打开手机相册,获取图片

测试使用