尝试呈现 UIActivityViewController 时崩溃

Posted

技术标签:

【中文标题】尝试呈现 UIActivityViewController 时崩溃【英文标题】:Crash when trying to present UIActivityViewController 【发布时间】:2015-05-05 08:49:01 【问题描述】:

我在 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 时它不是 nil,但是当呈现控制器时,我在 presentViewController 行中看到崩溃并且那里的活动控制器显示为 nil

【问题讨论】:

第二个数组中的nullptr 是什么?如果您想将 null 插入到数组中,请尝试 [NSNull null] 这是一个 c++ nil。没有注意到我在那里使用了 nullptr 但它应该没有任何区别 我认为值得一提,因为集合类型不能包含 nil 项(因为它是 [NSNull null])。 其实arrayWithObject必须以nil结尾 该死,你说得对。我太习惯使用@[item1, item2] 速记了。 :) 【参考方案1】:

József 解决了 cmets 中 nullptr 的使用问题,Fogh 指出实际的崩溃日志很重要(请编辑您的问题并发布完整的崩溃日志),但我想指出其他一些事情.

您假设初始化activityViewController 的调用成功。您应该进行防御性编码(通过假设所有可能失败可能失败并在运行时对此进行测试)。将其余的配置和演示包含在 if (activityViewController != nil) 条件中(您可能也应该有一个带有适当错误处理/报告的 else),因此您可以正确地检测到由于多种原因而导致的全面初始化失败(例如放错位置)笔尖、缺少资源等)。

在您的情况下,我认为初始化可能会失败,因为您的班级正在使用错误的数组做某事,正如 József 的 nullptr catch 所暗示的那样。也许您正在使用一个或多个 C++11 之前的 c 库/使用非 C11/gnu11“C 语言方言”构建设置进行编译,并且 nullptr 不等于 nil,导致奇怪的结果应该是零终止的数组?

注意:如果事实证明是这样,我很乐意投赞成票,但宁愿 József 发表他的评论作为答案,这样你就可以给他适当的信任。 (如果/何时发生这种情况,请随时从我的答案中编辑此请求。)

【讨论】:

用附加信息编辑了我的问题。日志中没有关于崩溃的任何内容 那是……奇怪。你在看哪里?

以上是关于尝试呈现 UIActivityViewController 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

警告:尝试在已经呈现的 MainTableViewController 上呈现 ModalTableViewController (null)

尝试在等待 GKTurnBasedMatchmakerViewController 延迟呈现完成的 ViewController 上呈现 GameViewController

从 AppDelegate 到 PresentedViewController 的警报:“尝试在...上呈现 UIAlertController 已经在呈现 UIAlertController”

如何防止尝试在已经呈现的控制器上呈现控制器时出错?

尝试呈现 UIActivityViewController 时崩溃

警告:尝试在已呈现 <RCTModalHostViewController> 的 <RNNsideMenuController> 上呈现 <UINavigationCon