2009-11-02 6 views
32

코코아 애플리케이션을 종료하는 좋은 방법을 찾고 있습니다. 이 코드는 프로덕션 코드에 사용되지 않으므로 안심하십시오. 한 가지 테스트를 실행 한 다음 디버깅하는 동안 응용 프로그램을 닫는 쉬운 방법을 찾고 있습니다.내 코코아 애플리케이션에서 애플리케이션 자체에서 종료하도록 지시하려면 어떻게해야합니까?

나는 exit(0);이 응용 프로그램을 종료하지만 모든 정상적인 응용 프로그램 종료 절차를 건너 뛴다는 것을 알았습니다. 모든 응용 프로그램 종료 절차를 무시하고 싶습니다.

기본적으로 사용자가 메뉴에서 "종료"를 선택한 것처럼 작동하지만, 테스트가 끝나면 자동으로 실행되기를 원합니다.

내 코드는 현재 다음과 같습니다

#if (SUPERFANCY_TESTING_MODE) 
    [self doSomething]; 
    exit(0); // <-- I need something better to go here 
#endif 
+3

... 물론 DoSomething은 doSomething이어야합니다 .... – bbum

+1

감사합니다, bbum. 나는 그것을 바꿨다. –

답변

82

당신은 꽤 많이 나머지는 앱이 적어도 시간의 일부를 살해 할 것이라는 것을 확신 할 수 있습니다. 따라서 exit(0);과 같은 출구에 대한 방어는이 필요합니다.

그러나 NSApplication은 -terminate: 메서드를 구현합니다.

[NSApp terminate: nil]; 원하는 것을해야합니다.

일반적으로 -performSelector:afterDelay:을 통해 지연을 0.0으로 게시하여 이벤트 루프를 통해 다음 번에 통과하도록 강제로 제안합니다.

예 : 그것은 같다

[NSApp performSelector:@selector(terminate:) withObject:nil afterDelay:0.0]; 
+0

완벽하게 작동합니다. 고맙습니다! –

+31

밀도가 높고 구문이 정확하지 않은 사람들을 위해 전체 줄을 읽습니다. [NSApp performSelector : @selector (terminate :) withObject : nil afterDelay : 0.0]; – BarrettJ

+1

요즘에는 dispatch_async가이 문제를 해결하는 데 더 좋은 방법 일 것입니다. –

2

[NSApp 종료 : ID] 중단되었다. 그래서, @bbum 상태로, 이것을 사용 : 나는 예상대로 LSUIElement 응용 프로그램의 상태 표시 줄 메뉴에 종료 메뉴 항목을 추가 할 때

[NSApp performSelector:@selector(terminate:) withObject:nil afterDelay:0.0]; 

의미가 있습니다.

+10

'[NSApp terminate :]'는 더 이상 사용되지 않습니다. 자동 완성에서 볼 수있는 deprecation은'NSInputServiceProvider'의'terminate' 메소드에서 가져옵니다. 그리고 만약 더 이상 사용되지 않는다면 performSelector :::에서 호출해서는 안됩니다. –

+0

하! 좋은 캐치, 고마워. – Matt

관련 문제