返回NSTerminateLater后NSApplicationDelegate未收到延迟调用?
解决NSApplicationDelegate返回NSTerminateLater后无后续调用的问题
你已经写好了处理终止前逻辑的readyToTerminate:方法,但核心问题是你没有在applicationShouldTerminate:里触发这个方法的执行。当你返回NSTerminateLater时,系统会进入等待状态,直到你主动调用replyToApplicationShouldTerminate:确认是否终止;如果没人触发你的准备逻辑,这个回复永远不会发出,终止流程就卡在这里了。
修复步骤:
在
applicationShouldTerminate:中启动终止准备逻辑
你需要在返回NSTerminateLater之前,触发你的readyToTerminate:方法。为了避免阻塞主线程(比如你的准备逻辑包含耗时操作),推荐异步执行这个方法:- (NSApplicationTerminateReply) applicationShouldTerminate:(NSApplication *)sender { // 异步启动终止准备,避免阻塞主线程 [self performSelector:@selector(readyToTerminate:) withObject:sender afterDelay:0.0]; return NSTerminateLater; }确保回复方法正确调用
你的readyToTerminate:方法已经包含了正确的回复逻辑,还可以稍微优化一下,直接用传入的sender调用回复方法(和NSApplication.sharedApplication效果一致,但更符合参数传递的逻辑):- (void) readyToTerminate: (id) sender { NSLog(@"Ready to terminate"); [(NSApplication *)sender replyToApplicationShouldTerminate:YES]; }
额外注意事项:
- 如果你的终止准备逻辑是异步任务(比如网络请求、文件保存),一定要确保任务完成后再调用
replyToApplicationShouldTerminate:,不要提前回复。 - 不要在
applicationShouldTerminate:里直接执行耗时操作,否则会导致应用无响应——这个方法是在主线程调用的。
内容的提问来源于stack exchange,提问作者William Jockusch
相关产品推荐
相关产品推荐

