gpt4 book ai didi

cocoa - 防崩溃 Mac Cocoa 应用程序

转载 作者:行者123 更新时间:2023-12-03 16:33:59 25 4
gpt4 key购买 nike

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

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

是否可以fork() Cocoa 应用程序? UI、线程、GC、KVO、runloops 在 fork 时将如何表现?

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

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

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

最佳答案

Is it possible to fork() Cocoa application?

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

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

How UI, threads, GC, KVO, runloops are going to behave when forked?

UI:窗口(屏幕上的实际窗口)不重复。当然,无论如何你都不能与你的 NSWindow 和 NSView 对象对话。

线程:不转移到子进程。 This is not as good as it may sound ,因为问题案例比比皆是;其一,另一个线程可能在父线程中持有锁,而该线程在子线程中保持锁定状态,即使持有该锁的线程不存在。

GC:嗯,垃圾收集器在线程上运行......

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

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

Can I avoid creating standalone executable launched via NSTask?

不。

If I launch separate process, how can I send and receive ObjC object instances?

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

否则,您可以使用 DO。

(I'd rather not serialize/unserialize them myself, and I need to keep them after child process ends).

然后您需要在父进程中复制一份。不知道这里是否可以使用copyWithZone:;可能不会。我怀疑您将不得不执行某种基于 plist 或基于存档的序列化/反序列化。

How does OS X handle this problem for Spotlight and Quicklook plugins?

Spotlight 有 mdworker; Quick Look 有类似的东西。

关于cocoa - 防崩溃 Mac Cocoa 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3417637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com