使用 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? [复制]