如何防止取消MFMailComposeViewController的崩溃?
某处:
if([MFMailComposeViewController canSendMail])
{
MFMailComposeViewController *email_vc = [[MFMailComposeViewController alloc] init];
email_vc.mailComposeDelegate = self;
[email_vc setSubject:subject];
[email_vc setMessageBody:message isHTML:FALSE];
[email_vc setToRecipients:recipients];
[self presentModalViewController:email_vc animated:FALSE];
[[UIApplication sharedApplication] setStatusBarHidden:TRUE];
[email_vc release];
}
else
...
别的地方:
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
switch (result)
{
case MFMailComposeResultCancelled:
NSLog(@"Cancelled");
break;
case MFMailComposeResultSaved:
NSLog(@"Saved");
break;
case MFMailComposeResultSent:
NSLog(@"Sent");
break;
case MFMailComposeResultFailed:
NSLog(@"Compose result failed");
break;
default:
NSLog(@"Default: Cancelled");
break;
}
// This ugly thing is required because dismissModalViewControllerAnimated causes a crash
// if called right away when "Cancel" is touched.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC), dispatch_get_current_queue(), ^
{
[self dismissModalViewControllerAnimated:FALSE];
});
}
那个丑陋的“dispatch_after”块是我能够在没有崩溃的情况下工作的唯一方法。
上下文是触摸电子邮件撰写视图控制器上的“发送”以外的任何内容都会导致崩溃。 有没有办法解决这个问题,而不必诉诸这个丑陋的创可贴? 我对创可贴的理论是,当你触摸“取消”来确认用户真的想要取消时,会呈现中间视图。 我想知道如果[self dismissModalViewControllerAnimated:FALSE];
正在试图排除序列中的某个观点或某种意思。 通过插入一个小小的延迟,我推理邮件撰写视图在被要求离开之前有时间清理。
我在另一个问题中看到了延迟。 笔者没有详细说明:
用于iPad的MFMailComposeViewController崩溃
编辑1:添加崩溃日志
Incident Identifier: ****************
CrashReporter Key: *****************
Hardware Model: iPhone4,1
Process: ************* [9038]
Path: /var/mobile/Applications/*********************
Identifier: ***********************
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2012-07-20 11:25:53.704 -0700
OS Version: iPhone OS 5.0.1 (9A405)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0xa003853a
Crashed Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x316b9fbc 0x316b6000 + 16316
1 UIKit 0x350caa9e 0x34f8e000 + 1297054
2 UIKit 0x34fa6814 0x34f8e000 + 100372
3 UIKit 0x34fabfb2 0x34f8e000 + 122802
4 QuartzCore 0x33354ba0 0x33329000 + 179104
5 libdispatch.dylib 0x37896f74 0x37894000 + 12148
6 CoreFoundation 0x37bac2d6 0x37b20000 + 574166
7 CoreFoundation 0x37b2f4d6 0x37b20000 + 62678
8 CoreFoundation 0x37b2f39e 0x37b20000 + 62366
9 GraphicsServices 0x376adfc6 0x376aa000 + 16326
10 UIKit 0x34fbf73c 0x34f8e000 + 202556
11 ***************** 0x00002346 main (main.m:14)
12 ***************** 0x00002304 start + 32
编辑2:经过多次抓挠它看起来这是一个真正的苹果bug。
我下载并运行了MailComposer示例项目:
http://developer.apple.com/library/ios/#samplecode/MailComposer/Introduction/Intro.html
它工作正常。
然后我编辑了代码,在呈现和解散邮件组合控制器时删除动画。
[self presentModalViewController:picker animated:FALSE];
和
[self dismissModalViewControllerAnimated:FALSE];
当然,当“取消”被用来取消电子邮件组成UI时,它会崩溃。
运行僵尸带出了这个:
-[MFMailComposeController actionSheet:didDismissWithButtonIndex:]: message sent to deallocated instance 0x7479ef0
我想操作表获取解雇消息,而不是邮件撰写视图控制器。
如果有人可以确认行为,我会报告错误。
编辑3:报告错误。
我接受的答案对导致此问题的潜在机制有很好的解释。 此外,在答复评论中来回回放的过程中,还发现了两个额外的解决方法。 所有的乐队帮助,但现在有几个选择。
我还没有检查,但我怀疑ShareKit也受到这个错误(如果邮件撰写视图控制器的演示文稿没有动画)。
我想操作表获取解雇消息,而不是邮件撰写视图控制器。
不完全的。
事件的顺序可能是这样发生的:
-actionSheet:clickedButtonAtIndex:
在其代表(MFMCVC)上。 -mailComposeController:didFinishWithResult:error:
在其委托(您的VC) [self dismissModalViewControllerAnimated:NO]
-actionSheet:didDismissWithButtonIndex:
在其代表上 解决方法是让Apple在-dealloc
执行actionSheet.delegate = nil
。
潜在的解决方法
[[self.modalViewController retain] autorelease]
[self dismissModalViewControllerAnimated:NO]
如果您使用ARC,这样做有点棘手。
这适用于我:
- (void) mailComposeController: (MFMailComposeViewController *) controller
didFinishWithResult: (MFMailComposeResult) result
error: (NSError *) error {
if(result == MFMailComposeResultSent){
[self dismissViewControllerAnimated:YES completion:NULL];
} else if (result == MFMailComposeResultCancelled) {
[self dismissViewControllerAnimated:YES completion:NULL];
}
}
链接地址: http://www.djcxy.com/p/94539.html上一篇: How to prevent crash on Cancel of MFMailComposeViewController?