线程1:MFMailComposeViewController的dismissModalViewController上的EXEC_BAD_ACCESS(试过iOS 5.1,5,4.3)

时间:2012-05-18 15:31:53

标签: iphone ios mfmailcomposeviewcontroller exc-bad-access

好的,这一直困扰着我一段时间......

我已经检查过,所有其他问题/答案都与非ARC项目有关。

每当我呈现MFMCvc并且我快速取消该消息时,我在iPhone上收到Thread1:EXEC_BAD_ACCESS错误消息。可以在iPad上正常工作,或者我让它静坐(比如30秒或更长时间)

有什么建议吗? (除了放一个计时器而不是在计时器启动之前解雇?)

BTW我对MFMessageComposeViewController做了同样的事情,它在iPhone和iPad上运行良好。

这是我提供它的代码

if (([action isEqualToString:@"EMail"]) && contact.length>0)
{
    MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];
    if([MFMailComposeViewController canSendMail]) {
        [mailViewController setSubject:@""];
        [mailViewController setMessageBody:@"" isHTML:NO];
        [mailViewController setToRecipients:[NSArray arrayWithObject:contact]];
        [mailViewController setMailComposeDelegate:self];
        [self presentModalViewController:mailViewController animated:NO];
    }
}

这是我解雇的地方

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
    {
        switch (result)
        {
            case MFMailComposeResultCancelled:
            {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Send EMail" message:@"EMail Has Been Cancelled"
                                                               delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
                [alert show];
            }
                break;
            case MFMailComposeResultFailed:
            {
                NSLog(@"Error");
            }
                break;
            case MFMailComposeResultSent:
            {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Send EMail" message:@"EMail Has Been Sent"
                                                               delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
                [alert show];
            }
                break;
            case MFMailComposeResultSaved:
            {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Send EMail" message:@"EMail Has Been Saved"
                                                               delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
                [alert show];
            }
                break;
            default:
                break;
        }
        [self dismissModalViewControllerAnimated:NO];
    }

2 个答案:

答案 0 :(得分:5)

1)不行:[self dismissModalViewControllerAnimated:NO]; - 需要:[controller dismissModalViewControllerAnimated:NO];?你想要解雇MFMailComposeViewController。

2)MFMailComposeViewController可能还存在未保留的问题。当我使用这个类时,我已经为控制器创建了一个属性。这可能值得一试。

// in the interface definition
 @property (nonatomic, strong) MFMailComposeViewController* mailComposer;

然后

// at creation time
if (([action isEqualToString:@"EMail"]) && contact.length>0)

if(![MFMailComposeViewController canSendMail]) return; // bail early if can't send mail

MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];
[mailViewController setSubject:@""];
[mailViewController setMessageBody:@"" isHTML:NO];
[mailViewController setToRecipients:[NSArray arrayWithObject:contact]];
[mailViewController setMailComposeDelegate:self];
[self presentModalViewController:mailViewController animated:NO];

[self setMailComposer: mailViewController];
// if not using ARC then:  [mailViewController release];

然后在didFinish

 [[self mailComposer] dismissModalViewControllerAnimated:YES];
 [self setMailComposer: nil];

答案 1 :(得分:1)

[self dismissModalViewControllerAnimated:NO] 移动到didFinishWithResult函数的顶部。换句话说,在显示警报视图之前关闭邮件视图。我不确定这是否会消除你的崩溃,但无论如何,你应该这样做。