尝试呈现 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