2010-07-02 5 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) 

여기 무슨 일이야?

편집 : 역 추적 :

너무 가까이
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로 설정하고 디버그합니다. – 0x8badf00d

답변

0

....

프롬프트가 (gdb)에서 입력 bt<return> 및 역 추적을 게시 할 수 있습니다.

그 외에도 위 코드의 self 대리인이 MBProgressHUD 인스턴스의 대리인으로 먼저 제외되지 않고 해제되고 할당 취소됩니다. 대의원은 일반적으로 약한 참조이므로 설명 할 때 충돌이 발생할 수 있습니다.


Ewwww ... 스택이 스톰되었습니다! 그 일이 생길 때 나는 그것을 싫어한다.

최상의 추측으로 돌아 가기. MBProgressHUD에서 대리인으로 삭제되기 전에 귀하의 대의원이 할당 해제됩니까? ... 코드에서 "빌드 및 분석"을 실행 했습니까?

+0

아니요, 역 추적은별로 유용하지 않습니다. 프로그램 수신 신호 : "EXC_BAD_ACCESS". [프로세스 23788로 전환] (gdb) bt objc_msgSend()의 # 0x029b4a93 의 # 1 0x00000000 ??() (gdb) –

+0

"Build and Analyze"는이 파일에 유용한 정보를 제공하지 않으므로 실제로 알 수 없습니다. 내가 아는 한, 대의원은 할당 해제되지 않았지만, 분명히 말할 수는 없습니다. 코드가 있어야한다고 생각하지 않습니다. –

1

MBProgress와 navigationController의 조합에서 이와 비슷한 문제가 발생했습니다. 선택기 호출에서 내비게이션 컨트롤러 동작을 호출 할 수없는 것처럼 보이는 이유는 메인 스레드에서만 탐색 이벤트를 사용해야하기 때문입니다.

관련 문제