2009-11-02 43 views
32

Tôi đang tìm một cách tốt để nói cho ứng dụng Cocoa của tôi thoát khỏi chính nó. Hãy yên tâm rằng điều này sẽ không được sử dụng cho mã sản xuất. Tôi chỉ đang tìm một cách dễ dàng để chạy một thử nghiệm và sau đó đóng ứng dụng trong khi gỡ lỗi.Tôi làm cách nào để yêu cầu ứng dụng Cocoa của tôi thoát khỏi ứng dụng?

Tôi nhận thấy rằng exit(0); sẽ đóng ứng dụng, nhưng nó bỏ qua tất cả các thủ tục thoát ứng dụng thông thường và tôi muốn giữ tất cả chúng ở đúng vị trí.

Về cơ bản, tôi muốn mọi thứ hoạt động như thể người dùng đã kéo "Thoát" khỏi menu, nhưng tôi muốn nó tự động diễn ra sau khi tôi đã hoàn thành bài kiểm tra của mình.

Mã của tôi hiện nay trông như thế này:

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

... và, tất nhiên, 'DoSomething' phải là' doSomething' .... – bbum

+1

Cảm ơn, bbum. Tôi đã thay đổi nó. –

Trả lời

82

Bạn có thể khá nhiều yên tâm rằng ứng dụng của bạn sẽ bị giết chết ít nhất một số thời gian. Do đó, việc bảo vệ khỏi các lối thoát giống như exit(0);là yêu cầu.

Tuy nhiên, NSApplication thực hiện phương thức -terminate:.

[NSApp terminate: nil]; nên làm những gì bạn muốn.

Tôi thường đề xuất đăng thông qua -performSelector:afterDelay: với độ trễ là 0.0 để buộc điều đó xảy ra ở đầu của lần vượt qua tiếp theo thông qua vòng lặp sự kiện.

Ví dụ:

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

Điều đó hoạt động hoàn hảo. Cảm ơn bạn! –

+31

Đối với những người bạn dày đặc (như tôi) và không thể nhận cú pháp chính xác (tôi cứ quên dấu hai chấm sau khi chấm dứt) dòng đầy đủ sẽ đọc: [NSApp performSelector: @selector (chấm dứt :) withObject: nil afterDelay : 0,0]; – BarrettJ

+1

Những ngày này dispatch_async có lẽ sẽ là một cách hay hơn để thực hiện việc này. –

2

Dường như [NSApp chấm dứt: id] đã bị phản đối. Vì vậy, với trạng thái @bbum, hãy sử dụng điều này:

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

Nó hoạt động như tôi mong đợi khi thêm mục menu Thoát vào menu thanh trạng thái của ứng dụng LSUIElement.

+10

'[NSApp chấm dứt:]' không được dùng nữa. Sự phản đối bạn thấy trong tự động hoàn thành xuất phát từ phương thức 'terminate' của' NSInputServiceProvider'. Và nếu nó sẽ không được chấp nhận, bạn không nên gọi nó trong 'performSelector :::'. –

+0

Ha! Tốt bắt, cảm ơn. – Matt

Các vấn đề liên quan