防崩溃Mac Cocoa应用程序

时间:2010-08-05 17:55:15

标签: cocoa macos process crash fork

在我的Cocoa应用程序中,我需要运行一个使用不稳定的无法修复代码的任务。它只需很少的输入,独立于应用程序的其余部分工作,并因此产生数千个ObjC对象。

如何在不关闭整个应用程序的情况下运行不稳定的部分并让它崩溃?

是否有可能fork() Cocoa应用程序?分叉时,UI,线程,GC,KVO,runloops的行为方式如何?

我可以避免创建通过NSTask启动的独立可执行文件吗?

如果我启动单独的进程,我该如何发送和接收ObjC对象实例? (我宁愿不自己序列化/反序列化它们,我需要在子进程结束后保留​​它们。)

OS X如何处理Spotlight和Quicklook插件的这个问题?

2 个答案:

答案 0 :(得分:2)

  

是否可以fork()Cocoa应用程序?

是的,但你几乎必须马上执行。如果您尝试在fork和exec之间使用某些Cocoa方法或CF函数(或者根本没有执行),Core Foundation将抛出异常。你可能会逃避一些事情(例如,我可以向窗口询问它的框架),但没有什么是安全的。

当然,启动NSTask算作fork和exec,避免了跳过或推迟exec的问题。

  

分叉时UI,线程,GC,KVO,runloops的行为如何?

UI:Windows(屏幕上的实际内容)不重复。当然,无论如何,你都无法与你的NSWindow和NSView对象交谈。

线程:不会转移到子进程。 This is not as good as it may sound,因为案件比比皆是;对于一个,另一个线程可能在父级中持有一个锁,即使没有持有它的线程,它也会保持锁定在子级中。

GC:好吧,垃圾收集器在一个线程上运行......

KVO:应该没问题,因为通常会明确地或通过KVO提供的包装器访问器触发观察。

运行循环:每个线程一个,所以主线程的运行循环应该仍然存在,但是如果你返回它就会死掉。

  

我可以避免创建通过NSTask启动的独立可执行文件吗?

不。

  

如果我启动单独的进程,我该如何发送和接收ObjC对象实例?

如果你不执行,你就不会。

否则,您可以使用DO。

  

(我不想自己序列化/反序列化它们,我需要在子进程结束后保留​​它们。)

然后,您需要在父进程中制作副本。我不知道你是否可以在这里使用copyWithZone:;可能不是。我怀疑你将不得不做一些基于plist或archive的序列化/反序列化。

  

OS X如何处理Spotlight和Quicklook插件的这个问题?

Spotlight有mdworker;快速查看有类似的东西。

答案 1 :(得分:1)

我使用Distributed Objects在我的可可程序和一个单独的(不可靠的)工作程序之间进行通信。我将工作者作为NSTask开始。分布式对象非常优雅地组合在一起。