【问题标题】:Collection <__NSArrayM: 0x170e45d00> was mutated while being enumerated - UIImagePickerConteroller didFinishPickingMediaWithInfo集合 <__NSArrayM: 0x170e45d00> 在枚举时发生了变异 - UIImagePickerConteroller didFinishPickingMediaWithInfo
【发布时间】:2023-03-13 02:45:01
【问题描述】:

我有一个使用 UIImagePickerConteroller 拍照的原生 Objective-C 应用程序。一旦 UIImagePickerController didFinishPickingMedia 委托函数返回图像,我将图像存储在我的应用程序文档目录中并将图像位置存储在一个数组中,以便我可以在我的应用程序库视图中显示它。

不经常,但每月一两次,在用户完成拍照后,我会在 AppSee/Fabric 崩溃跟踪器中收到崩溃日志。

在 Appsee 视频中,我可以看到崩溃发生的确切位置。崩溃日志说 NSArray 在被枚举时发生了变异(检查附加的图像)。现在我在枚举时没有对我的照片 mutableArray 执行任何 addObject 或 removeObject 功能。在读取数据以显示我的照片库之前,我正在对我的照片数组进行可变副本。所以在被枚举的时候没有变异的机会。

根据崩溃日志,问题似乎与 UIImagePickerController 有关。因为日志说——

-[CAMPriorityNotificationCenter _postNotification:forEntries:]

-[CAMPriorityNotificationCenter _notificationReceiver:]

UIImagePickerController 类使用“CAMPriorityNotification”。但不确定 UIImagePickerController 是否引发错误并导致崩溃。我将@try @catch 放入didFinishPickingMedia 函数中以查找崩溃问题。但是@try @catch 没有抛出错误。所以这让我更加困惑。

有没有人在拍照后遇到过类似的崩溃问题?任何建议我都将不胜感激。

【问题讨论】:

    标签: ios objective-c nsarray uiimagepickercontroller


    【解决方案1】:

    这是苹果的问题。苹果回应了我的错误报告。这是他们的回应 -

    “工程部门已确定您的错误报告 (31369562) 与另一个问题 (29753773) 重复,并将被关闭。 您的问题被复制到的原始错误报告的打开或关闭状态显示在错误报告器用户界面的黄色“XXXXXXXX 重复”部分。此部分显示在错误编号、标题、状态、产品和排名下方的右列错误详细视图顶部附近。"

    【讨论】:

    • 你找到解决办法了吗?
    • 不。他们还没有回复我。我们的旧应用程序仍然在相机视图中崩溃。不是很频繁。
    • 我最终停止使用默认相机。现在我正在使用 ALCameraViewController
    • 看起来是个不错的相机控制器。我将在我的下一个项目中使用它。
    • 在 iOS 14.0.1 中,我更频繁地遇到这种崩溃,而且总是来自同一个用户
    【解决方案2】:

    尝试在 2 种情况下将您对 UIImagePickerController* 的引用设置为 nil:

    1. 当您收到来自控制器的图像时 - 在功能中 "didFinishPickingImage"
    2. 当您转到后台或从通过属性链接到 UIImagePickerController 的屏幕返回时。我在调用 viewDidDissapear 时做到了:

      - (void)viewDidDissapear:(BOOL)animated {
     
      
        [super viewDidDissapear: animated];
  
      
        self.photoPicker = nil; // that property of type UIImagePickerController*
 
      

      }

      我在 CAMPriorityNotificationCenter 中遇到了很多崩溃,都在后台。在这 2 项更改(如上所述)之后 - 没有出现崩溃。

    【讨论】:

    • 关闭视图时不会发生这种情况。一旦你从照片选择器控制器回来,它就会发生。是苹果的问题。他们在 iOS 12.x 上修复了它
    • 在我的情况下,崩溃仍然在 iOS 12.4 中重复。也许你 Saleh Sultan 和我有不同的崩溃,但在 Crashlytics 中它们看起来是一样的。
    • 我在 iOS 13.1.2 上遇到了同样的崩溃,但仅在 iPad Pro 设备上,第 6 代和第 7 代 iPad 都可以。
    【解决方案3】:

    所以我定期获取这个 iOS 14 和 15,直到我更改我的代码以不在完成处理程序中执行任何操作。我曾经在那里进行图像保存/处理。

    它是这样写的:

    - (void)imagePickerController:(UIImagePickerController *)picker 
    didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
      [picker dismissViewControlle Animated:YES
                                 completion:^{
                                              // Process and Save Image
                                             }];
    }
    

    现在我把它改成了:

    - (void)imagePickerController:(UIImagePickerController *)picker
    didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
      if (picker.isBeingDismissed) {
        return;
      }
      
      [picker dismissViewControllerAnimated:YES 
                                 completion:nil];
      
      // Process and save image
    }
    

    我每周都会遇到几次这种崩溃,现在已经有大约 2 周没有崩溃了。

    更新 - 所以我现在仍然每两周收到一次。全部在 14.* 设备上...

    【讨论】:

      【解决方案4】:

      看起来您的代码可能会同时访问和修改集合。

      【讨论】:

        猜你喜欢
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-15
        • 2013-01-29
        相关资源
        最近更新 更多