为什么调用MFMailComposeViewController释放调用它的视图?

时间:2014-11-10 21:48:13

标签: ios objective-c iphone

我有这个简单的功能来在ios 8.0,xcode 6.1上写邮件。没什么特别的,直到ios 8.0打招呼才开始工作。 sendMail函数在点击按钮时发送邮件(通过故事板设置)。我调试了它,代码似乎没问题,但每当你应该返回主应用程序时,它就会出现EXC_BAD_ACCESS代码= 1错误,就像点击MFMailComposeViewController的发送或关闭按钮一样。在我看来,我的View,我的意思是调用MFMailComposeViewController时调用MFMailComposeViewController的视图被释放,因此当它被解除时,没有任何东西可以返回。解决问题的一些想法? [函数didFinishWithResult永远不会到达:崩溃发生在之前。]

编辑:准确地说,如果在presentViewController中我将动画设置为NO,它会与bad_access崩溃。如果是YES它会抱怨'开始/结束外观转换的不平衡调用'并且点击发送/解除不会做任何事情(它不会返回。邮件视图仍然存在,但点击按钮不执行任何操作)

编辑我对释放是正确的。他有同样的问题,但似乎没有有效的解决方案MFMailComposeViewController crash in iOS6 ARC 在我的情况下,Arc已关闭,我无法因各种原因打开它。该理论得到了僵尸仪器的证实。它说'一个Objective-C消息被发送到一个解除分配的'View'对象(僵尸),地址为:0x14e01720'

View.h
included MFMailComposeViewControllerDelegate and imported
#import <MessageUI/MFMailComposeViewController.h>

View.m
-(IBAction)sendEmail:(id)sender{

NSString *mailDiretta=emailText.currentTitle;

composer = [[MFMailComposeViewController alloc] init];
[composer setMailComposeDelegate:self];
if ([MFMailComposeViewController canSendMail]) {
    [composer setToRecipients:[NSArray arrayWithObjects:mailDiretta, nil]];
    [composer setSubject:@"Infos"];
    [composer setMessageBody:@"Write to me, dude!" isHTML:NO];
    [composer setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
    [self presentViewController:composer animated:YES completion:NULL];
    [composer release];
} else
[composer release];
}

// function below is never reached
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
if (error) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"error"
                                                    message:[NSString stringWithFormat:@"error %@", [error description]]
                                                   delegate:nil cancelButtonTitle:@"dismiss" otherButtonTitles:nil, nil];
    [alert show];
    [self dismissViewControllerAnimated:YES completion:NULL];
} else {
    [self dismissViewControllerAnimated:YES completion:NULL];
}
}

1 个答案:

答案 0 :(得分:1)

我会假设它是因为你在完成之前释放了作曲家。

[composer release];

编辑:如何初始化此属性,为什么它是属性?在方法中创建并尝试。此外,您的不平衡呼叫正在发生,因为您在动画邮件控制器关闭的同时动画UIAlert。每个人都需要在防止该消息之前完成。

composer = [[MFMailComposeViewController alloc] init];

尝试删除属性并在函数中初始化。

MFMailComposeViewController *composer = [[MFMailComposeViewController alloc] init];

确保您也正确添加了委托。

#import <MessageUI/MessageUI.h>
@interface YourViewController : UIViewController <MFMailComposeViewControllerDelegate> 

像这样设置你的代表

composer.mailComposeDelegate = self;

对于不平衡的通话,请重新安排您的提醒......

[self dismissViewControllerAnimated:YES completion:NULL];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"error"
                                                message:[NSString stringWithFormat:@"error %@", [error description]]
                                               delegate:nil cancelButtonTitle:@"dismiss" otherButtonTitles:nil, nil];
[alert show];

编辑2: 在看到你因为一个课程而无法使用ARC的评论后,我建议你只需在该课程上设置一个-fno-objc-arc编译器标志,并在你的项目中启用ARC,让你的生活更轻松。 Disable Automatic Reference Counting for Some Files