Можно ли использовать вилку() для какао?
Да, но вы в значительной степени должны выполнить exec немедленно. Core Foundation будет генерировать исключение, если вы попытаетесь использовать определенные методы Cocoa или CF-функции между fork и exec (или вообще не выполняете execking). Вы могли бы уйти от некоторых вещей (например, я мог спросить окно его фрейм), но ничего не безопасно.
Запуск NSTask, конечно, считается как fork и exec вместе, предотвращая проблемы пропусков или отсрочки exec.
Как UI, резьба, GC, KVO, runloops будут вести себя при раздвоении?
UI: Windows (фактические на экране) не дублируются. Конечно, вы не можете разговаривать со своими объектами NSWindow и NSView.
Темы: Не переносится на подпроцесс. This is not as good as it may sound, поскольку проблемных случаев предостаточно; для одного, другой поток мог иметь замок в родительском элементе, который остается заблокированным в дочернем элементе, хотя нить, которая его удерживала, отсутствует.
GC: Ну, сборщик мусора работает на волоске ...
КВО: Должно быть хорошо, так как наблюдение, как правило, срабатывает либо явно, либо KVO поставляемыми оберток аксессорах.
Пробег: по одному на поток, поэтому цикл выполнения основного потока все еще существует, но он умрет, если вы вернетесь к нему.
Могу ли я избежать создания автономного исполняемого файла, запущенного через NSTask?
Nope.
Если я запускаю отдельный процесс, как я могу отправлять и получать экземпляры объектов ObjC?
Если вы не выполняете, вы этого не сделаете.
В противном случае вы можете использовать DO.
(Я бы предпочел не сериализовать/неэтериализовать их самостоятельно, и мне нужно сохранить их после завершения дочернего процесса).
Затем вам нужно будет сделать копию в родительском процессе. Я не знаю, можете ли вы использовать copyWithZone:
; возможно нет. Я подозреваю, что вам придется делать какую-то сериализацию/unserialization на основе plist или архива.
Как OS X справляется с этой проблемой для плагинов Spotlight и Quicklook?
Spotlight имеет mdworker; У Quick Look есть нечто похожее.
Почему это неустойчиво и неустойчиво? Зачем вам использовать такую программу? Почему вы не можете сделать его стабильным? Возможно, вы задаете неправильный вопрос, может быть, не должно быть «как я могу скомпрометировать свое приложение?» и, возможно, это должно быть «как я могу исправить этот неустойчивый код?». – Jasarien
Пожалуйста, просто предположите, что код нефиксирован. Я не хочу обсуждать свои причины здесь. Я думаю, что решение может быть интересно и другим пользователям, которым, возможно, придется работать с сторонними плагинами, библиотеками с закрытыми исходными кодами или нуждаться в совместимости со старыми API-интерфейсами ОС, которые являются шероховатыми. – Kornel