尝试呈现UIActivityViewController时崩溃

时间:2015-05-05 08:49:02

标签: objective-c cocoa ios8 uiactivityviewcontroller

我发现Crashlytics中的崩溃有时会发生在用户身上。在以下代码的最后一行中显示UIActivityViewController时会发生崩溃:

NSData* snapShot = ... ;

UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObjects:activityTextsProvider, snapShot ,nil] applicationActivities:[NSArray arrayWithObjects:customActivityA, customActivityB, customActivityC, nullptr]];

activityViewController.excludedActivityTypes = [NSArray arrayWithObjects:UIActivityTypePrint, UIActivityTypeAssignToContact, UIActivityTypeMail, UIActivityTypeCopyToPasteboard, nil];
activityViewController.popoverPresentationController.sourceView = self.myButton;
activityViewController.popoverPresentationController.sourceRect = self.myButton.bounds;

activityViewController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError)
{
    ...
};

[self presentViewController:activityViewController animated:YES completion:nil];

我在主线程中执行此操作,无法在本地重现此崩溃。这次崩溃的原因是什么?

编辑:我将nullptr更改为nil,问题仍然存在。我设法重现了这个问题:崩溃只发生在打开活动控制器之前我才显示UIMenuController。在创建UIActivityViewController时,它不是零,但在呈现控制器时,我看到presentViewController行中的崩溃和活动控制器显示为nil

1 个答案:

答案 0 :(得分:0)

József在评论中解决了nullptr的使用问题,并且Fogh认为实际崩溃日志很重要(请编辑您的问题并发布完整的崩溃日志),但我想指出别的什么。

您假设初始化activityViewController的呼叫正在成功。您应该采取防御性编码(通过假设可能失败的所有内容可能失败并在运行时对此进行测试)。将其余的配置和演示文稿包含在if (activityViewController != nil) {}条件中(您应该有一个else,并且还有正确的错误处理/报告),因此您可以出于多种原因正确检测到全部初始化失败(如错误的笔尖,缺少资源等)。

在你的情况下,我认为初始化可能是失败的,因为你的类正在使用错误的数组做事,正如József的nullptr捕获所示。也许您正在使用一个或多个pre-C ++ 11 c库/使用非C11 / gnu11“C语言方言”构建设置进行编译,并且nullptr不等同于nil,导致一个假定为零的数组的奇怪结果?

注意:如果事实证明是这样的话,我会很高兴地接受投票,但我宁愿József发表他的评论作为答案,所以你可以给予他适当的信任。 (如果发生这种情况,请随时根据我的答案编辑此请求。)