在我的Cocoa应用程序中,我需要运行一个使用不稳定的无法修复代码的任务。它只需很少的输入,独立于应用程序的其余部分工作,并因此产生数千个ObjC对象。
如何在不关闭整个应用程序的情况下运行不稳定的部分并让它崩溃?
是否有可能fork()
Cocoa应用程序?分叉时,UI,线程,GC,KVO,runloops的行为方式如何?
我可以避免创建通过NSTask
启动的独立可执行文件吗?
如果我启动单独的进程,我该如何发送和接收ObjC对象实例? (我宁愿不自己序列化/反序列化它们,我需要在子进程结束后保留它们。)
OS X如何处理Spotlight和Quicklook插件的这个问题?
答案 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开始。分布式对象非常优雅地组合在一起。