我有这个简单的功能来在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];
}
}
答案 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