Приложение аварийно завершает работу при закрытии компоновщика почты и отображении HUD

У меня есть кнопка в моем приложении, при нажатии на которую появится MFMailComposerViewController, а когда композитор закроется, MBProgressHUD с настраиваемым представлением покажет пользователю, успешно ли отправлено письмо или нет.

Он отлично работает, если я нажму кнопку отправки в композиторе, почта будет отправлена, композитор будет закрыт, и отобразится HUD. Однако, если я нажимаю кнопку отмены в представлении композитора, композитор закрывается, но HUD не отображается, и приложение аварийно завершает работу.

Вот журнал аварии.

2012-02-02 22:49:34.821 App[5091:707] -[ViewController size]: unrecognized selector 
sent to instance 0x319210
2012-02-02 22:49:34.831 App[5091:707] *** Terminating app due to uncaught exception 
'NSInvalidArgumentException', reason: '-[ViewController size]: unrecognized selector sent to instance 0x319210'
*** First throw call stack:
(0x340af8bf 0x342ff1e5 0x340b2acb 0x340b1945 0x340b27b8 
0x3748cfa5 0xf051 0x203d1 0x37553f5b 0x374f393b 0x374f37bf 
0x3746d81b 0x37472fb9 0x34bc4ba7 0x36ce3e8d 0x340822dd 
0x340054dd 0x340053a5 0x30889fcd 0x37486743 0xe7a7 0xe74c)
terminate called throwing an exception

ViewController — это контроллер, представляющий компоновщик почты.

Вот код, который я использовал:

-(void)showHUDWithMessage:(NSString *)msg
{
HUD = [[MBProgressHUD alloc]initWithWindow:self.window];
[self.window addSubview:HUD];
HUD.delegate = self;
UIImage *image;
NSString *labelTextToShow;

//Do something here

UIImageView *imageView = [[[UIImageView alloc]initWithImage:image]autorelease];

HUD.labelText = labelTextToShow;
HUD.customView = imageView;

HUD.mode = MBProgressHUDModeCustomView;
[HUD show:YES];
[HUD hide:YES afterDelay:3.0];
}

-(void)mailFriend:(id)sender
{
MFMailComposeViewController *mailController = [[MFMailComposeViewController alloc]init];
mailController.mailComposeDelegate = self;

[mailController setSubject:@"Mail Subject"];

NSString *emailBody = @"Message";
[mailController setMessageBody:emailBody isHTML:YES];

[self presentModalViewController:mailController animated:YES];
}

-(void)mailComposeController:(MFMailComposeViewController *)controller 
    didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
NSString *msg;
switch (result) {
    case MFMailComposeResultSent:
        msg = @"Sent";
        break;
    case MFMailComposeResultFailed:
        msg = @"Fail";
        break;
    case MFMailComposeResultCancelled:
        msg = @"Cancelled";
        break;
    case MFMailComposeResultSaved:
        msg = @"Cancelled";
        break;
    default:
        break;
}

//Show HUD here
[self showHUDWithMessage:msg];
[self dismissModalViewControllerAnimated:YES];
[controller release];

}

Поскольку, если письмо отправлено, представление композитора может успешно закрыться, HUD также может отображаться правильно, я действительно не знаю, что здесь не так...

Спасибо!


comment
Что-то отправляет сообщение [size] в viewController. Могу поспорить, что в MBProgressHUD есть ошибка. Нажмите Cmd+Shift+F и найдите «размер». Там скорее всего и будет ваша проблема.   -  person CodaFi    schedule 03.02.2012
comment
@CodaFi Я думал, что проблема может быть в этом, но я не могу найти метод, называемый размером...   -  person Jing    schedule 03.02.2012
comment
Попробуйте вызвать метод с задержкой. Итак, например [самостоятельно выполнитьселектор:@селектор(callHUD) withObject:self afterDelay://time];   -  person CodaFi    schedule 03.02.2012
comment
Извините, попробуйте изменить [self.window addsubview] на [self.view addSubview]   -  person CodaFi    schedule 03.02.2012
comment
@CodaFi Я пробовал это, все равно вылетает...   -  person Jing    schedule 03.02.2012
comment
Подобные сбои может вызвать чрезмерное освобождение объекта или доступ к освобожденному объекту. UIKit может что-то делать с вашим ViewController, отправляя сообщение о размере, которое могло быть освобождено к моменту отправки сообщения. Включите переменную среды NSZombie и протестируйте свое приложение.   -  person 0x8badf00d    schedule 03.02.2012
comment
@ Цзин, посмотри на ответ, который я опубликовал.   -  person 0x8badf00d    schedule 03.02.2012
comment
Вы пытаетесь вызвать какой-либо метод с помощью MBProgressHUD или просто показываете HUD?   -  person Dhaval Panchal    schedule 03.02.2012
comment
Вы пытаетесь вызвать какой-либо метод с помощью MBProgressHUD или просто показываете HUD?   -  person Dhaval Panchal    schedule 03.02.2012


Ответы (2)


Скорее всего, это проблема с перераспределением памяти. Включите NSZombie и протестируйте свое приложение.

Пара вещей: где вы создали контроллер? Вы несете ответственность за выпуск объектов, которыми владеете. У вас нет объекта контроллера, поэтому не выпускайте его:

[controller release]; // comment this line

in
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error

Далее:

-(void)mailComposeController:(MFMailComposeViewController *)controller 
    didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
NSString *msg = nil; // If result is not equal to any of the case statements then you want to pass nil to [self showHUDWithMessage:msg];
switch (result) {
    case MFMailComposeResultSent:
        msg = @"Sent";
        break;
    case MFMailComposeResultFailed:
        msg = @"Fail";
        break;
    case MFMailComposeResultCancelled:
        msg = @"Cancelled";
        break;
    case MFMailComposeResultSaved:
        msg = @"Cancelled";
        break;
    default:
        break;
}

//Show HUD here
[self showHUDWithMessage:msg];
[self dismissModalViewControllerAnimated:YES];
[controller release];

}

и MFMailComposeViewController *mailController = [[MFMailComposeViewController alloc]init]; в -(void)mailFriend:(id)sender autorelease или выпустите его позже. Хотя это не имеет никакого отношения к вашей проблеме.

person 0x8badf00d    schedule 03.02.2012

Удалите все ссылки на MBProgressHUD и добавьте в свой метод простой NSLog. Бьюсь об заклад, мой нижний доллар МБ вызывает это.

Если нет, то управление памятью — мой очевидный второй выбор. Закомментируйте [выпуск контроллера];

person CodaFi    schedule 03.02.2012