代码之家  ›  专栏  ›  技术社区  ›  Kornel

防崩溃Mac Cocoa应用程序

  •  2
  • Kornel  · 技术社区  · 14 年前

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

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

    可以吗 fork() 可可应用?当分叉时,UI、线程、GC、KVO、RunLoops的行为如何?

    我能避免创建独立的可执行文件吗? NSTask ?

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

    OSX如何为Spotlight和QuickLook插件处理这个问题?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Peter Hosey    14 年前

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

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

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

    当分叉时,UI、线程、GC、KVO、RunLoops的行为如何?

    用户界面:窗口(屏幕上的实际窗口)不重复。当然,您无论如何也不能与nswindow和nsview对象交谈。

    线程:未转移到子进程。 This is not as good as it may sound ,因为问题案例很多;例如,另一个线程可能在父线程中持有锁,而父线程仍然锁定在子线程中,即使持有它的线程不存在。

    垃圾收集器运行在线程上。

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

    运行循环:每个线程一个,所以主线程的运行循环应该仍然存在,但是如果您返回到它,它将死亡。

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

    不。

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

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

    否则,可以使用do。

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

    然后您需要在父进程中创建一个副本。我不知道你能不能用 copyWithZone: 在这儿,可能没有。我怀疑您必须进行某种基于plist或存档的序列化/非序列化。

    OSX如何为Spotlight和QuickLook插件处理这个问题?

    聚光灯下有MDWorker;快速浏览也有类似的功能。

        2
  •  1
  •   neoneye    14 年前

    我用 Distributed Objects 在我的Cocoa程序和一个单独的(不可靠的)工人程序之间进行通信。我把这个工人当替罪羊。分布式对象被非常优雅地组合在一起。