Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么MFMailComposeViewController会崩溃?_Ios_Uikit - Fatal编程技术网

Ios 为什么MFMailComposeViewController会崩溃?

Ios 为什么MFMailComposeViewController会崩溃?,ios,uikit,Ios,Uikit,在调用“[MFMailComposeViewController canSendMail]”后,我看到一个奇怪的崩溃 我无法复制它,它来自iTunesConnect。该方法(canSendMail)是从主线程调用的,在这一点上,我没有对地址簿做任何事情 如有任何意见/建议,将不胜感激 提前谢谢 注意:这发生在iOS 5.1.1中 Exception Type: SIGABRT Exception Codes: #0 at 0x3583232c Crashed Thread: 0 Threa

在调用“[MFMailComposeViewController canSendMail]”后,我看到一个奇怪的崩溃

我无法复制它,它来自iTunesConnect。该方法(canSendMail)是从主线程调用的,在这一点上,我没有对地址簿做任何事情

如有任何意见/建议,将不胜感激

提前谢谢

注意:这发生在iOS 5.1.1中

Exception Type:  SIGABRT
Exception Codes: #0 at 0x3583232c
Crashed Thread:  0

Thread 0 Crashed:
0   libsystem_kernel.dylib              0x3583232c __pthread_kill + 8
1   libsystem_c.dylib                   0x347e729f abort + 95
2   AppSupport                          0x3133cc57 abortAfterFailingIntegrityCheck + 39
3   AppSupport                          0x3133ceef runIntegrityCheckAndAbort + 535
4   AppSupport                          0x3133d025 checkResultWithStatement + 113
5   AppSupport                          0x3133ea13 _connectAndCheckVersion + 1059
6   AppSupport                          0x3133eab7 CPSqliteDatabaseConnectionForWriting + 43
7   AppSupport                          0x3133eb8d CPSqliteDatabaseRegisterFunction + 21
8   AddressBook                         0x337873f7 ABCDBContextCreateWithPathAndAddressBook + 215
9   AddressBook                         0x3377b429 ABCCreateAddressBookWithDatabaseDirectoryAndForceInProcessMigrationInProcessLinkingAndResetSortKeys + 233
10  AddressBook                         0x33789cd7 ABAddressBookCreate + 15
11  Message                             0x31072453 MFThreadLocalAddressBook + 87
12  MessageUI                           0x313a5471 +[MFMailComposeController initialize] + 9
13  libobjc.A.dylib                     0x35edc973 _class_initialize + 239
14  libobjc.A.dylib                     0x35edc87b prepareForMethodLookup + 143
15  libobjc.A.dylib                     0x35edc747 lookUpMethod + 47
16  libobjc.A.dylib                     0x35edc713 _class_lookupMethodAndLoadCache3 + 19
17  libobjc.A.dylib                     0x35edbfcb objc_msgSend_uncached + 27
18  MessageUI                           0x313a5455 +[MFMailComposeViewController canSendMail] + 33
=============

更新:

导致此崩溃的代码片段如下所示:

-(IBAction)helpButtonPressed
{
    if([MFMailComposeViewController canSendMail])
    {   
        NSString* mail  = self.feedbackSettings[@"mail"];
        NSString* title = self.feedbackSettings[@"title"];

        MFMailComposeViewController* mailComposer = [[MFMailComposeViewController alloc] init];
        mailComposer.mailComposeDelegate = self;
        mailComposer.toRecipients = @[ mail ];
        mailComposer.subject = title;

        [self presentViewController:mailComposer animated:YES completion:nil];
        [mailComposer release], mailComposer = nil;
    }
    else
    {
        [UIAlertView showAlertViewWithTitle:nil message:NSLocalizedString(@"Please, setup a mail account in your phone first.", nil) buttonTitle:NSLocalizedString(@"OK", nil)];
    }
}

我最近看到一个运行iOS 5的客户的崩溃报告,它实际上是这个报告的副本。我最好的猜测是它是由一个损坏的通讯录数据库引起的。请注意,崩溃发生在对
ABAddressBookCreate
的调用中(这是一个误导性的名称;更像是open);你所做的一切都不应该导致这种情况

如果您可以控制通讯簿,并且正在某个地方同步它,您可以尝试关闭同步,删除所有联系人,然后重新同步(当然,先备份)

MFMailComposeViewController
正在访问通讯簿,大概是为了向用户提供:地址


[Nit:在退出函数之前取消自动变量没有多大意义。]

仅在此处添加一些数据,这看起来像是超出了您的控制范围。来自一个实时应用程序的崩溃数据显示,同样的崩溃发生在成千上万的用户中的11人身上。所有的崩溃都发生在iOS 5.1和5.1.1的某些版本中,因此问题似乎在iOS 6中得到了解决


如另一个答案中所述,您可以将对
[MFMailComposeViewController canSendMail]
的调用包装在
@try{}
块中,并且在它引发异常的情况下不执行任何操作。这至少可以防止地址簿损坏的可怜用户崩溃。

这是iOS 5中的一个bug,在iOS 6中得到了解决。无法在iOS 5设备上“修复”,这不是您的错

以下是我如何处理它

我所做的是在我的代码周围放置一个try/catch,如果捕获到此异常,我:

答:如果用户所在的设备无法升级到iOS 6(较旧的设备,不在此列表中:),请优雅地弹出一个对话框,说明我们遇到了由Apple导致的错误,无法控制或修复,并且只有较新的iOS设备才能修复此问题

B:如果用户使用的是可以升级到iOS 6的设备,则弹出一个对话框,让用户知道该错误,并指示他们升级到iOS 6,以便将来解决该问题


希望这能以最好的方式处理这个问题。

可能是当
可以发送电子邮件时,您试图呈现
MFMailComposeViewController
返回
NO
。您能在创建
MFMailComposeViewController
的地方附加一段代码吗,当canSendEmail为否时,我不会尝试演示MFMailComposeViewController。我会更新问题,谢谢。不,我不喜欢ARC。除此之外,如果启用了ARC并调用[mailComposer release],则不会生成代码。谢谢拉出除canSendMail调用之外的所有代码,看看它是否崩溃。您的通讯簿似乎已损坏。或者也许你的应用程序做了一些更早的事情,比如双重处理一个对象,使它处于一个糟糕的状态。您可以尝试使用analyzer,并在启用zombies的情况下运行。感谢您花时间撰写本文!。是的,我也这么认为,它看起来像一个腐败的通讯录。(不,我没有同步)。关于零变量,您是对的,但总有一个潜在的风险,即其他开发人员将扩展您的代码,并可能错过发布!。可以更具体地回答问题。我还在Crashlytics中看到这一点,事实上,每个崩溃的人仍然在iOS 5.1或5.1.1上。谢谢你的帮助Ethan。我们将在几周内放弃对iOS 5的支持,这将使事情变得更加容易!。嗨,你有什么关于bug的信息吗?此外,像Jorge和其他有类似问题的人一样,我自己也没有使用AddressBook——你把这个异常处理放在哪里了?@ethan,我正试图从苹果公司找到关于这个iOS 5错误的任何文档或验证。你能告诉我什么吗?