防崩溃Mac Cocoa应用程序

防崩溃Mac Cocoa应用程序,cocoa,macos,process,crash,fork,Cocoa,Macos,Process,Crash,Fork,在Cocoa应用程序中,我需要运行一个使用不稳定的不可编译代码的任务。它只需要很少的输入,独立于应用程序的其余部分工作,并因此生成数千个ObjC对象 如何在不关闭整个应用程序的情况下运行不稳定的部分并让其崩溃? 是否可以fork()Cocoa应用程序?当分叉时,UI、线程、GC、KVO和runloops将如何运行 我是否可以避免创建通过NSTask启动的独立可执行文件 若启动单独的进程,如何发送和接收ObjC对象实例?(我不希望自己序列化/取消序列化它们,我需要在子进程结束后保留它们) OS X

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

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

是否可以
fork()
Cocoa应用程序?当分叉时,UI、线程、GC、KVO和runloops将如何运行

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

若启动单独的进程,如何发送和接收ObjC对象实例?(我不希望自己序列化/取消序列化它们,我需要在子进程结束后保留它们)

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

我使用cocoa程序和一个单独的(不可靠的)工作程序之间的通信。我将工人作为NSTask启动。分布式对象非常优雅地组合在一起

是否可以在应用程序中使用fork()

是的,但你必须马上执行。如果您尝试在FoeX和Exc之间使用某些COOA方法或CF函数(或者根本不执行),则核心基础将抛出异常。你可能会侥幸逃脱一些事情(例如,我可以问窗户的框架),但没有什么是安全的

当然,启动一个NSTask可以同时算作fork和exec,避免了跳过或延迟exec的问题

当分叉时,UI、线程、GC、KVO和runloops将如何运行

UI:窗口(屏幕上的实际窗口)不重复。当然,您也不能与NSWindow和NSView对象对话

线程:未结转到子进程,因为问题案例比比皆是;首先,另一个线程可能在父线程中持有锁,即使持有该锁的线程不存在,该锁仍在子线程中保持锁定

垃圾收集器在一个线程上运行

KVO:应该可以,因为观察通常是显式触发的,或者是由KVO提供的包装访问器触发的

运行循环:每个线程一个,因此主线程的运行循环应该仍然存在,但如果返回它,它将消失

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

没有

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

如果你不执行,你就不会

否则,您可以使用DO

(我不希望自己序列化/取消序列化它们,我需要在子进程结束后保留它们)

然后您需要在父进程中创建一个副本。我不知道你是否可以在这里使用
copyWithZone:
;可能不会。我怀疑您将不得不进行某种基于plist或归档的序列化/非序列化

OSX如何处理Spotlight和Quicklook插件的这个问题


聚光灯已经成为一名工人;Quick Look也有类似的功能。

为什么它不稳定且不可修复?你为什么要使用这样的程序?你为什么不能让它稳定下来?您可能问了一个错误的问题,可能不应该是“我的应用程序如何防崩溃?”或者应该是“我如何修复这个不稳定的代码?”。请假设代码是不可编译的。我不想在这里辩论我的理由。我认为其他人可能也对该解决方案感兴趣,他们可能需要使用第三方插件、封闭源代码库,或者需要与脆弱的旧操作系统API兼容。分布式对象文档指出,当连接断开时,对象将不复存在。我希望任务快速结束,但将对象保留在主进程中。我该怎么做?不存在了。。。我不确定你到底在问什么。我的任务是长期存在的,我可以通过DO调用其中的方法,而不会出现问题。DO将序列化/取消序列化每个请求,因此代码看起来就像我在同一进程中与对象交互一样。如果您的任务很短,那么可能只需将STDIN和STDOUT用于IPC,这方面的一个很好的例子是:还有。。posix_spawn()是fork/exec的现代替代品。我认为NSTask正在内部使用它。谢谢您的详细回答。总而言之:
NSTask
+
NSKeyedArchiver
是一条路吗?我可以这么说。请注意,如果您想从任意一方发送自定义类的实例,则需要在这些类中实现NSCoding。