2010-07-02 7 views
1

Кажется, что использование MBProgressHUD приводит к сбою моего приложения. Без кода HUD, следующие работает просто отлично, но с ним, он выходит из строя:MBProgressHUD приводит к сбою приложения

{ 

    ... 

    HUD = [[MBProgressHUD alloc] initWithView:self.view]; 

    // Add HUD to screen 
    [self.view addSubview:HUD]; 

    // Register for HUD callbacks so we can remove it from the window at the right time 
    HUD.delegate = self; 

    HUD.labelText = @"Connecting"; 

    // Show the HUD while the provided method executes in a new thread 
    [HUD showWhileExecuting:@selector(runLocalNotificationHandler) onTarget:self withObject:nil animated:YES]; 

[[self navigationController] popViewControllerAnimated:YES]; 
} 

- (void) runLocalNotificationHandler 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

[self createLocalNotificationWithBug:[self tempBug]]; 

    [self performSelectorOnMainThread:@selector(finishedUpdatingNotifications) withObject:nil waitUntilDone:NO]; 

    [pool release]; 
} 

- (void)finishedUpdatingNotifications 
{ 

    [[self navigationController] popViewControllerAnimated:YES]; 
} 

- (void)hudWasHidden { 
    // Remove HUD from screen when the HUD was hidden 
    [HUD removeFromSuperview]; 
    [HUD release]; 
} 

Следующая отладочный вывод производится:

gdb) continue 
2010-07-02 00:07:55.224 Bugger[16796:207] >>> Entering -[HomeViewController viewDidAppear:] <<< 
2010-07-02 00:07:55.225 Bugger[16796:207] <<< Leaving -[HomeViewController viewDidAppear:] >>> 
2010-07-02 00:07:55.224 Bugger[16796:7007] <<< Leaving -[BugDetailViewController runLocalNotificationHandler] >>> 
2010-07-02 00:07:55.226 Bugger[16796:207] >>> Entering -[BugDetailViewController prepareToolbar] <<< 
2010-07-02 00:07:55.227 Bugger[16796:207] <<< Leaving -[BugDetailViewController prepareToolbar] >>> 
2010-07-02 00:07:55.229 Bugger[16796:207] >>> Entering -[BugDetailViewController dealloc] <<< 
[Switching to process 16796] 
2010-07-02 00:07:55.260 Bugger[16796:207] <<< Leaving -[BugDetailViewController dealloc] >>> 
[Switching to process 16796] 
Program received signal: “EXC_BAD_ACCESS”. 
(gdb) 

Что здесь происходит?

EDIT: Backtrace:

Program received signal: “EXC_BAD_ACCESS”. 
[Switching to process 23788] 
(gdb) bt 
#0 0x029b4a93 in objc_msgSend() 
#1 0x00000000 in ??() 
(gdb) 
+0

Когда я вижу EXC_BAD_ACCESS, я бы установил переменную среды NSZombieEnabled в YES и debug. – 0x8badf00d

ответ

0

Так близко ....

типа bt<return> в то (gdb) быстрое и вывесить трассировку.

Помимо этого, я полагаю, что ваш делегат - self в приведенном выше коде - освобождается и освобождается без предварительного удаления в качестве делегата из экземпляра MBProgressHUD. Делегаты, как правило, являются слабыми ссылками, и, таким образом, это может привести к сбою, когда вы описываете.


Ewwww ... ваш стек был затоптан! Я ненавижу, когда это происходит.

Назад к лучшему предположению; вы освобождаете делегата до его удаления в качестве делегата от MBProgressHUD? ... вы запускаете «Build and Analyze» в своем коде?

+0

Нет, backtrace не очень полезен: Полученный сигнал программы: «EXC_BAD_ACCESS». [Переключение на процесс 23788] (gdb) bt # 0 0x029b4a93 в objc_msgSend() # 1 0x00000000 in ??() (gdb) –

+0

«Build and Analyze» не дает мне ничего полезного для этого файла ... поэтому я не могу сказать. Насколько мне известно, делегат не освобождается, но я действительно не могу сказать, очевидно. Код не отражает, что это должно быть. –

1

У меня была аналогичная проблема с этой комбинацией MBProgress и navigationController, по какой-то причине похоже, что вы не можете вызывать действия контроллера навигации из селекторного вызова, вы должны использовать события навигации только в основном потоке, надеюсь, что это поможет.

Смежные вопросы