为什么我的应用程序在iOS 10上重复显示和使用UIImagePickerController时崩溃?

为什么我的应用程序在iOS 10上重复显示和使用UIImagePickerController时崩溃?,ios,objective-c,iphone,uiimagepickercontroller,Ios,Objective C,Iphone,Uiimagepickercontroller,我们几年前开发的一款应用程序在iOS 10面世后开始崩溃。该应用程序反复显示UIImagePickerController,允许用户捕捉一个主题的多张照片。这样做40多次后,应用程序崩溃。这在我们测试过的所有设备上都是可复制的,但在引入iOS 10之前没有发生过。我们在Info.plist文件中有NSCameraUsageDescription和NSPhotoLibraryUsageDescription密钥 我已经创建了一个示例应用程序来演示这个问题。以下是最终导致崩溃的代码: - (IBAc

我们几年前开发的一款应用程序在iOS 10面世后开始崩溃。该应用程序反复显示UIImagePickerController,允许用户捕捉一个主题的多张照片。这样做40多次后,应用程序崩溃。这在我们测试过的所有设备上都是可复制的,但在引入iOS 10之前没有发生过。我们在Info.plist文件中有NSCameraUsageDescription和NSPhotoLibraryUsageDescription密钥

我已经创建了一个示例应用程序来演示这个问题。以下是最终导致崩溃的代码:

- (IBAction) cameraPressed:(id) sender {
    self.picker = [[UIImagePickerController alloc] init];
    self.picker.sourceType =  UIImagePickerControllerSourceTypeCamera;
    self.picker.delegate = self;
    self.picker.allowsEditing = NO;
    [self presentViewController:self.picker animated:YES completion:nil];
}
2016-11-04 20:30:11.884984 WLPBeta[2747:275474] [MC] Invalidating cache
2016-11-04 20:30:11.890776 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:30:13.017608 WLPBeta[2747:275091] [MC] Invalidating cache
2016-11-04 20:30:13.018312 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:30:19.271720 WLPBeta[2747:276311] [MC] Invalidating cache
2016-11-04 20:30:19.279462 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:08.229294 WLPBeta[2747:278515] [MC] Invalidating cache
2016-11-04 20:32:08.273941 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:09.335711 WLPBeta[2747:278514] [MC] Invalidating cache
2016-11-04 20:32:09.342161 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:14.193376 WLPBeta[2747:278515] [MC] Invalidating cache
2016-11-04 20:32:14.213902 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:47.944657 WLPBeta[2747:275091] [MC] Invalidating cache
2016-11-04 20:32:47.972053 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:48.550934 WLPBeta[2747:279485] [MC] Invalidating cache
2016-11-04 20:32:48.575065 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:50.855308 WLPBeta[2747:279485] [MC] Invalidating cache
2016-11-04 20:32:50.856329 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:52.201535 WLPBeta[2747:275091] [GatekeeperXPC] Connection to assetsd was interrupted or assetsd died
当用户重复使用连接到此iAction的摄影机按钮时,它最终开始减速(拾取程序的显示开始花费更长的时间),并最终崩溃(通常在使用摄影机50多次后)。不会生成崩溃日志,尽管连接到Xcode时,控制台中会出现如下输出,导致崩溃:

- (IBAction) cameraPressed:(id) sender {
    self.picker = [[UIImagePickerController alloc] init];
    self.picker.sourceType =  UIImagePickerControllerSourceTypeCamera;
    self.picker.delegate = self;
    self.picker.allowsEditing = NO;
    [self presentViewController:self.picker animated:YES completion:nil];
}
2016-11-04 20:30:11.884984 WLPBeta[2747:275474] [MC] Invalidating cache
2016-11-04 20:30:11.890776 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:30:13.017608 WLPBeta[2747:275091] [MC] Invalidating cache
2016-11-04 20:30:13.018312 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:30:19.271720 WLPBeta[2747:276311] [MC] Invalidating cache
2016-11-04 20:30:19.279462 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:08.229294 WLPBeta[2747:278515] [MC] Invalidating cache
2016-11-04 20:32:08.273941 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:09.335711 WLPBeta[2747:278514] [MC] Invalidating cache
2016-11-04 20:32:09.342161 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:14.193376 WLPBeta[2747:278515] [MC] Invalidating cache
2016-11-04 20:32:14.213902 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:47.944657 WLPBeta[2747:275091] [MC] Invalidating cache
2016-11-04 20:32:47.972053 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:48.550934 WLPBeta[2747:279485] [MC] Invalidating cache
2016-11-04 20:32:48.575065 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:50.855308 WLPBeta[2747:279485] [MC] Invalidating cache
2016-11-04 20:32:50.856329 WLPBeta[2747:273019] [MC] Reading from public effective user settings.
2016-11-04 20:32:52.201535 WLPBeta[2747:275091] [GatekeeperXPC] Connection to assetsd was interrupted or assetsd died
我还向苹果发布了一份bug报告,并将其添加到open radar:

有人遇到过这个问题吗?有没有一个修复程序可以让我们在不使用Xcode 8重新编译应用程序的情况下绕过这个问题?不幸的是,我们使用的第三方库尚未为Xcode 8和iOS 10 SDK做好准备,因此我们仍在使用Xcode 7.3.1构建应用程序

编辑:这里有一个指向Github回购的链接,其中包含一个示例应用程序,可用于演示该问题

编辑2:如果我更改代码以便在viewDidLoad中分配和初始化选择器,则在使用相机按钮的次数大致相同后,它仍会崩溃

- (void)viewDidLoad {
    [super viewDidLoad];
    self.picker = [[UIImagePickerController alloc] init];
    self.picker.sourceType =  UIImagePickerControllerSourceTypeCamera;
    self.picker.allowsEditing = NO;
}

- (IBAction) cameraPressed:(id) sender {
    [self presentViewController:self.picker animated:YES completion:nil];
}
试试这个代码

- (IBAction) cameraPressed:(id) sender {
   if (self.picker == nil){
      self.picker = [[UIImagePickerController alloc] init];
   }

    self.picker.sourceType =  UIImagePickerControllerSourceTypeCamera;
    self.picker.delegate = self;
    self.picker.allowsEditing = NO;
    [self presentViewController:self.picker animated:YES completion:nil];
}

您是否尝试在cameraPressed()函数中声明Imagepicker变量


您的UIImagePickerController被定义为强


在销毁视图之前,请将其更改为“弱”或确保对象为“零”。

您需要明确关闭
UIImagePickerController
,即使它看起来是自动关闭的。如果没有,它可能会保留视图控制器,从而导致内存问题

从:

如果将图像选择器的ShowScameraControl属性设置为“否”,则 提供您自己的自定义控件,您可以拍摄多张照片 在关闭图像选择器界面之前。但是,如果你设置了 属性设置为“是”,则您的代理必须关闭图像选择器接口 用户拍摄一张照片或取消操作后

默认情况下,该属性为“是”,因此需要忽略

使用类似于以下内容的内容:

- (IBAction) cameraPressed:(id) sender {
    UIImagePickerController* picker = [[UIImagePickerController alloc] init];
    picker.sourceType =  UIImagePickerControllerSourceTypeCamera;
    picker.allowsEditing = NO;
    picker.delegate = self;
    [self presentViewController:picker animated:YES completion:nil];
}

- (void) imagePickerController:(UIImagePickerController *)picker
    didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void) imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [self dismissViewControllerAnimated:YES completion:nil];
}
-(iAction)摄像机显示:(id)发送方{
UIImagePickerController*picker=[[UIImagePickerController alloc]init];
picker.sourceType=UIImagePickerController源类型摄像头;
picker.allowsdediting=否;
picker.delegate=self;
[自我呈现视图控制器:选择器已设置动画:是完成:无];
}
-(无效)imagePickerController:(UIImagePickerController*)选择器
didFinishPickingMediaWithInfo:(NSDictionary*)信息
{
[自我解除视图控制器激活:是完成:无];
}
-(无效)ImagePickerController IDCancel:(UIImagePickerController*)选择器
{
[自我解除视图控制器激活:是完成:无];
}

您使用过仪器吗?可能您有内存泄漏或引用周期。我们有,但没有检测到任何泄漏或引用周期。如问题中所述,我将问题归结为一个简单的示例应用程序,只需在Xcode创建的框架项目中添加几行代码。我添加的代码如问题所示。是否有任何特殊原因使您必须在每次按下按钮时初始化imagePicker?为什么不将所有代码行移动到viewDidLoad,当按下按钮时,只触发presentViewController方法?没有特别的原因,但是如果我将选择器的初始化移动到viewDidLoad,在拍摄了大约相同数量的照片后,我仍然会遇到崩溃。您可能会遇到一个引用计数循环,将self.picker.delegate对象设置为其他对象(不是来自视图控制器的self),以避免ref-count循环问题。