2013-06-18 10 views
1

NSPopover 개체를 만들고 파괴하는 데 심각한 문제가있는 것 같습니다. NSPopover는 인스턴스 변수로 설정됩니다. popover가 nil인지 확인하지 않고 nil로 설정하더라도 SIGSEGV로 끝납니다. 나는이 문제를 몇 시간 동안 알아 내려고 노력했지만 아무 것도 생각해 내지 못했다.NSPopover Crash

- (void)addMenuIconPopup 
{ 
    MenuPopupViewController *popoverController = [[MenuPopupViewController alloc] init]; 
    if(menuIconPopover != nil) { 
     [self removeMenuIconPopup]; 
    } 
    menuIconPopover = [[NSPopover alloc] init]; 
    [menuIconPopover setContentViewController:popoverController]; 
    [menuIconPopover showRelativeToRect:[[statusItem view] frame] 
         ofView:[statusItem view] 
        preferredEdge:NSMinYEdge]; 
} 

- (void)removeMenuIconPopup 
{ 
    if(menuIconPopover != nil) { 
     [menuIconPopover close]; 
     menuIconPopover = nil; 
    } 
} 

편집 : NSPopover 자체가 중단의 원인이되는 것으로 보인다. 다음은 프로세스 샘플의 관련 부분입니다 (NDA가 적용될 수있는 부분은 공백 임).

2762 Thread_2921859 
    2762 thread_start (in libsystem_c.dylib) + 13 [0x7fff8f0011e1] 
    2762 _pthread_start (in libsystem_c.dylib) + 327 [0x7fff8f0147a2] 
     2762 ??? (in variouslibrary.dylib) load address 0x1000cd000 + 0xb9461 [0x100186461] 
     2762 ??? (in variouslibrary.dylib) load address 0x1000cd000 + 0x26390 [0x1000f3390] 
      2762 VariousControllerDelegateListener::onConnect(VariousController::Controller const&) (in App) + 93 [0x10001d4cd] VariousControllerObjectiveC.mm:1752 
      2762 -[VariousControllerController onConnect:] (in App) + 126 [0x100006eae] VariousControllerController.m:215 
       2762 -[TutorialWindowController variousControllerConnected] (in App) + 88 [0x100031a78] TutorialWindowController.m:93 
       2762 _NSPopoverCloseAndAnimate (in AppKit) + 840 [0x7fff89bac8d7] 
        2762 -[NSWindow orderWindow:relativeTo:] (in AppKit) + 159 [0x7fff8950ac1f] 
        2762 -[NSWindow _doOrderWindow:relativeTo:findKey:forCounter:force:isModal:] (in AppKit) + 668 [0x7fff8950af28] 
         2762 -[_NSWindowTransformAnimation startAnimation] (in AppKit) + 512 [0x7fff8936b95c] 
         2762 _NSWindowExchange (in AppKit) + 376 [0x7fff89a27555] 
          2762 -[NSWindow _reallyDoOrderWindow:relativeTo:findKey:forCounter:force:isModal:] (in AppKit) + 1377 [0x7fff8950ba18] 
          2762 -[NSNextStepFrame displayIfNeeded] (in AppKit) + 84 [0x7fff895d8e64] 
           2762 -[NSView displayIfNeeded] (in AppKit) + 1044 [0x7fff8944e981] 
           2762 -[NSView _sendViewWillDrawInRect:clipRootView:] (in AppKit) + 1195 [0x7fff8948240a] 
            2762 -[NSViewHierarchyLock lockForReadingWithExceptionHandler:] (in AppKit) + 378 [0x7fff894259e1] 
            2762 _pthread_cond_wait (in libsystem_c.dylib) + 869 [0x7fff8f018fe9] 
             2762 __psynch_cvwait (in libsystem_kernel.dylib) + 10 [0x7fff8a53d0fa] 
+0

을 통해, 단순히 메인 스레드에서 함수를 호출하여이 문제를 해결 결국 않는 한 질문? –

+0

정확히 어떤 라인이 SIGSEGV를 제공합니까? 문제는 nil 포인터가 아닌 잘못된 메모리를 참조하는 포인터 일 가능성이 큽니다. 아마 릴리스 된 객체를 가리키는 것입니다. – Skotch

+0

특정 중단 점을 사용하여 특정 줄을 찾으려면 어떻게합니까? 예외가 발생한 스레드 만 보여줍니다 (아직 Xcode에 익숙하지 않았습니다). – agg23

답변

0

나는 왜 행동이 어떤 오류 메시지와 함께 충돌 할 수있는 응용 프로그램을 리드 정확히 말씀하는 것이 어렵다

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