在iPhone iOS8上取消时UIActivityViewController崩溃

在iPhone iOS8上取消时UIActivityViewController崩溃,ios,objective-c,exc-bad-access,uiactivityviewcontroller,presentviewcontroller,Ios,Objective C,Exc Bad Access,Uiactivityviewcontroller,Presentviewcontroller,我正在使用ViewController中的这行代码显示activityViewController [MyClass showShareMenuWithString:@“测试字符串”发送方:self] 这是MyClass中此方法的声明 + (void)showShareMenuWithString:(NSString*)text sender:(id)sender{ NSArray* array = [NSArray arrayWithObject:[NSString stringWit

我正在使用ViewController中的这行代码显示activityViewController

[MyClass showShareMenuWithString:@“测试字符串”发送方:self]

这是MyClass中此方法的声明

+ (void)showShareMenuWithString:(NSString*)text sender:(id)sender{
    NSArray* array = [NSArray arrayWithObject:[NSString stringWithFormat:@"%@",text]];
    UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:array applicationActivities:nil];

    [sender presentViewController:activityView animated:YES completion:nil];

}
之后,屏幕上会显示activityView,可以选择发送短信或电子邮件等操作。选择此操作之一后,邮件控制器的SMS将在屏幕上显示预填充的数据。但在取消此控制器后,我的应用程序因EXC_BAD_访问错误而崩溃。这是随机发生的,这个控制器很可能会消失而不崩溃。应用程序仅限于iPhone,阵列不是零

应用程序在iOS7上没有崩溃。它在不同iOS 7/8的iPhone上进行了测试。有人有同样的问题吗?有什么发现吗?

谢谢@Y.Bonafons

在弹出后的前一个控制器中,我没有将我的委托设置为nil,这就是它试图调用其方法的原因

启用僵尸对象对我帮助很大。

感谢@Y.Bonafons

在弹出后的前一个控制器中,我没有将我的委托设置为nil,这就是它试图调用其方法的原因


启用僵尸对象对我帮助很大。

另一个问题可能与UIActivityViewController崩溃有关,可能是在展开可选值时意外发现零

在指定作为完成处理程序的闭包中,当操作扩展将控制权返回给应用程序时,请确保在使用它之前检查可选的

例如,使用可选绑定确定可选returnedItems是否包含值(naïf代码):


这只是一种尝试方法,但您肯定可以编写更好的内容。

另一个问题可能与UIActivityViewController崩溃有关,可能是在展开可选值时意外发现的零

在指定作为完成处理程序的闭包中,当操作扩展将控制权返回给应用程序时,请确保在使用它之前检查可选的

例如,使用可选绑定确定可选returnedItems是否包含值(naïf代码):


这只是一种尝试的方式,但您肯定可以编写更好的东西。

EXC\u BAD\u ACCESS通常意味着您尝试访问一个已解除分配的对象,尝试找出哪个对象(在调试器中,您可以看到对它调用了哪个方法)。在这种情况下,我猜是“发件人”对象在弹出activityView后消失。您可以启用zombie对象以帮助您找到已使用但已解除分配的对象:edit scheme/diagnostics/enable zombie.EXC_BAD_ACCESS通常指您尝试访问已解除分配的对象,尝试找出哪个是(在调试器中,您可以看到对其调用了哪个方法)。在这种情况下,我猜是“发送者”对象在弹出activityView后消失。您可以启用zombie对象以帮助您找到已使用但已解除分配的对象:编辑方案/诊断/启用zombie。
activityViewController.completionWithItemsHandler =
            { (activityType, completed, returnedItems, error) in

    if let a = returnedItems {
                    ...
                } else {
                    return
                }
...