MFMailComposeViewController Absturz während dismissModalViewControllerAnimated in iOS5
Ich bin mit MFMailComposeViewController in meinem conde bieten E-Mail-Funktionalität, aber nach dem senden von Nachrichten oder wenn ich stornieren möchte E-mail-es wird Abstürzen.
unten ist mein code:
(IBAction)FnForPlutoSupportEmailButtonPressed:(id)sender {
{
if ([MFMailComposeViewController canSendMail])
{
MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
mailer.mailComposeDelegate = self;
[mailer setSubject:@"Need help from Pluto support team"];
NSArray *toRecipients = [NSArray arrayWithObjects:@"[email protected]",nil];
[mailer setToRecipients:toRecipients];
NSString *emailBody = @"";
[mailer setMessageBody:emailBody isHTML:NO];
//mailer.modalPresentationStyle = UIModalPresentationPageSheet;
[self presentModalViewController:mailer animated:YES];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Failure"
message:@"Your device doesn't support the composer sheet"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles: nil];
[alert show];
}
} }
(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
//Notifies users about errors associated with the interface
switch (result)
{ case MFMailComposeResultCancelled:
break;
case MFMailComposeResultSaved:
break;
case MFMailComposeResultSent:
break;
case MFMailComposeResultFailed:
break;
default:
break;
}
[self dismissModalViewControllerAnimated:YES];
}
Habe ich gelesen, die alle blog-post, aber keine Lösung gefunden, Diese blog-post ist mit guten Erläuterungen über dieses, aber pro bin ich nicht präsentieren, meine view-controller in viewdidload oder viewdidappear.
Ich bin Immer EXE_BAD_ACCESS, ist nach der crash-log :
**
> #0 0x00000000 in ?? ()
> #1 0x01dc5aa4 in -[UIViewController _setViewAppearState:isAnimating:] ()
> #2 0x01dc5f47 in -[UIViewController __viewDidDisappear:] ()
> #3 0x01dc6039 in -[UIViewController _endAppearanceTransition:] ()
> #4 0x01dd2e7e in -[UIViewController(UIContainerViewControllerProtectedMethods) endAppearanceTransition] ()
> #5 0x01fc8de1 in -[UIWindowController transitionViewDidComplete:fromView:toView:] ()
> #6 0x01da334b in -[UITransitionView notifyDidCompleteTransition:] ()
> #7 0x01da3070 in -[UITransitionView _didCompleteTransition:] ()
> #8 0x01da531b in -[UITransitionView _transitionDidStop:finished:] ()
> #9 0x01d23fb6 in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] ()
> #10 0x01d24154 in -[UIViewAnimationState animationDidStop:finished:] ()
> #11 0x0163bbce in CA::Layer::run_animation_callbacks ()
> #12 0x03664fe4 in _dispatch_client_callout ()
> #13 0x03655997 in _dispatch_main_queue_callback_4CF ()
> #14 0x012c03b5 in __CFRunLoopRun ()
> #15 0x012bf804 in CFRunLoopRunSpecific ()
> #16 0x012bf6db in CFRunLoopRunInMode ()
> #17 0x030f1913 in GSEventRunModal ()
> #18 0x030f1798 in GSEventRun ()
> #19 0x01ce82c1 in UIApplicationMain ()
**
Als pro aktualisiert Dokument von apple für ios 5, die Sie erwähnt :
presentModalViewController:animiert:
Stellt einen modalen view verwaltet von der gegebenen view-controller für den Benutzer. (Veraltet). Verwenden presentViewController:animated:completion:
statt.)
- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated
Parameters
Entlässt den view-controller vorgestellt wurde durch den Empfänger. (Veraltet). Verwenden dismissViewControllerAnimated:completion:
statt.)
- (void)dismissModalViewControllerAnimated:(BOOL)animated
Hatte ich versucht dies auch, aber es stürzt immer noch
- Bitte das crash-log
- Bitte Frage mit aktuellen crash-log.
- Versuchen Sie aktivieren NSZombies zu sehen, wenn etwas über wird veröffentlicht. ich sehe es nicht in deinem code, eigentlich sehe ich ein Leck seit Ihr nicht die Freigabe der mailer (es sei denn, ARC verwendet wird).
- Ich bin mit der ARC und NSZombies aktiviert ist.
- Dein code funktioniert perfekt für mich, erste Gedanken.. was tun Ihre Importe Aussehen, und sind Sie Einstellung MFMailComposeViewControllerDelegate?
- Ja, ich bin Einstellung Delegieren und import ist auch richtig.
- Wow - wer hätte gedacht, Sie wurden mit SHKSwizzle - Sie werden nie erwähnt, das ist jetzt die Antwort!?!
- Sorry David, ich hätte nie gedacht, dass SHKSwizzle ist, gebe mir Mühe. danke für die Hilfe Mann.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie benötigen, um einen starken Bezug zur MFMailComposeViewController *mailer in Ihrer Klasse, und nachdem Sie entlassen können Sie die null-Referenz. Frag mich wie ich das wissen 🙂
Später, wenn Sie komplett fertig mit ihm, Sie einfach "mailer = null;" zu lösen.
EDIT: Was ich tun und vorschlagen, ist zu verwenden, einen block auf der main-Warteschlange auf die Freigabe. Wenn Sie nur " selbst.mailer = null' dann wird der release passiert nach der letzten Delegat-Methode beendet hat und Sie sind sicher nicht mehr verwenden.
EDIT2: Dieser Absturz nicht passieren die ganze Zeit auf allen Geräten - ich würde sagen es ist eher eine race-condition zwischen, wenn Sie Sie erhalten das endgültige delegate-Methode und wenn er seine Arbeit beendet. Apple sagt nichts über die holding einen Verweis, eine oder andere Weise - jedoch Allgemeine Praxis, die auf Apple-Produkte davon aus, dass jedes Objekt, das Sie erhalten, ist "auf Kredit" durch eine runLoop, und danach, wenn Sie möchten, halten eine Referenz, die Sie zum beibehalten des Objekts.
Wenn Ihr mit sharekit framework implementiert, im code springen SHK.m und ändern
zu
Dieser wird Ihr problem lösen.
Danke an alle für Antwort.
und auch Kommentar diese Zeilen
HALLO, können Sie verwenden Sie folgenden code, um E-mail senden E-mail-Anwendung wird nicht senden Sie keine E-Mail-Formular-simulator, müssen Sie installieren Sie die Anwendung auf dem Gerät. EXE_BAD_ACCESS kommt, wenn Sie versuchen, Zugriff auf das Objekt, das Sie nicht im Gedächtnis und remamber Gerät ist groß-und Kleinschreibung.
Seit dem anhalten der stack ist
0x00000000
ich gehe davon aus, dass einige code, der in UIKit ist das springen zu einer null-Funktion Zeiger. Aktivieren Zombies und sehen, ob man einen zombie object access Fehler. (Bearbeiten Sie Ihr Projekt Schema, unter Run/Debug, Diagnose-Registerkarte, Aktivieren Sie "Zombie-Objekte")versuchen, diesen code, das funktioniert gut, ohne Absturz.. Kontaktieren Sie uns Methode-Knopf-Ziel-Selektor..
Wenn du mit der ARC, der controller-Objekt wird freigegeben wurden, bevor Sie anrufen entlassen.
Behalten uns das Objekt irgendwo neben einem Stapel zugewiesene variable.
Haben Sie delegieren MFMailComposeViewControllerDelegate in .h-Datei. Ich habe vor, dieses problem in der Vergangenheit. Und der Fehler war sehr gering. Bitte überprüfen Sie delegieren .h-Datei.