Странная ошибка при отклонении MFMailComposeViewController: ошибка: адрес не содержит раздела, который указывает на раздел в объектном файле

Я получаю действительно странную ошибку MFMailCompseViewController. Ошибка "ошибка: адрес не содержит раздел, который указывает на раздел в объектном файле". Приложение аварийно завершает работу после закрытия MFMailCompseViewController и фактической отправки электронной почты.

Это характерно для MFMailComposeViewController, так как я пытался модально представить простой контроллер представления, и он отлично отклоняется.

Вот код, который я написал для calland Present mail Composer:

- (void) emailImage:(UIImage *)img {
//verified that the image is being returned correctly
UIImage *img1 = [[_delegate photoBrowser:self photoAtIndex:0] underlyingImage];

MFMailComposeViewController *mfViewController = [[MFMailComposeViewController alloc] init];
mfViewController.mailComposeDelegate = self;

NSString *subject = @"Check out this photo I took - Cap That App";

[mfViewController setSubject:subject];
NSData *imgData = UIImageJPEGRepresentation(img1, 1.0);
[mfViewController addAttachmentData:imgData mimeType:@"image/jpg" fileName:@"photo.jpg"];

NSString *contactMessage = @"\n\n<a href=\"http://www.agilerocket.com\">Sent via Cap That - Available in the Apple App Store</a>";

[mfViewController setMessageBody:contactMessage isHTML:YES];

[self presentViewController:mfViewController animated:YES completion:nil];

}

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Status:" message:@"" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil] autorelease];

switch (result) {
    case MFMailComposeResultCancelled:
        alert.message = @"You chose not to send the email.";
        break;
    case MFMailComposeResultSaved:
        alert.message = @"Your email was saved as a draft. It has not been sent yet.";
        break;
    case MFMailComposeResultSent:
        alert.message = @"Your email has been sent!";
        break;
    case MFMailComposeResultFailed:
        alert.message = @"There was an error sending the email. Please verify your email is working and try again.";
        break;
    default:
        alert.message = @"You chose not to send the email.";
        break;
}

[self dismissViewControllerAnimated:YES completion:^(void) {
    [alert show];
}];

}

Заранее спасибо за любую помощь в этом.


person TomWildcat    schedule 18.07.2012    source источник
comment
Это похоже на сбой в GDB/LLDB, а не на основную ошибку. Что плохого в том, чтобы просто немедленно показать предупреждение?   -  person tc.    schedule 24.07.2012


Ответы (1)


Я получаю ту же ошибку в своем приложении, действуя на жест касания на HUD. Мой метод распознавания жестов использует свойство блока в HUD для выполнения необходимых действий, и именно здесь он дает сбой (код внутри блока никогда не запускается). Очевидно, программа не может получить доступ к этому коду, и, поскольку у вас также есть блок завершения, это может быть ключом к тому, что происходит.

Я не вижу, чтобы я делал что-то не так в своем коде, и вы, похоже, тоже этого не делаете, так что, возможно, это ошибка. Вы случайно не запускаете предварительную версию Xcode для разработчиков (4.4 или 4.5)?

Редактировать: оказывается, моя проблема заключалась в том, что свойство блока кода освобождалось до того, как оно получило возможность запуститься. Я думаю, в вашем случае может произойти нечто подобное с предупреждением var. Можете ли вы попробовать переместить предупреждение в блоке завершения?

Редактировать 2. В качестве альтернативы попробуйте добавить префикс инициализации оповещения с префиксом __weak (или __unsafe_unretained, если вы ориентируетесь на iOS 4.3), это должно сработать. Если вы не используете ARC, используйте вместо этого __block.

person lucianf    schedule 24.07.2012
comment
Свойства блока должны быть copy, а не retain или strong. - person tc.; 24.07.2012
comment
@tc.: да, оказалось, что свойство блока было assign в той структуре, которую я использовал; изменил его на copy и теперь все отлично работает. - person lucianf; 25.07.2012