Ударопрочное приложение Mac Cocoa - PullRequest
2 голосов
/ 05 августа 2010

В моем приложении Какао мне нужно запустить задачу, которая использует нестабильный нефиксированный код. Он требует небольшого ввода, работает независимо от остальной части приложения и в результате генерирует тысячи объектов ObjC.

Как запустить нестабильную часть и дать ей вылететь, не удаляя все приложение?

Возможно ли fork() применение какао? Как будут работать пользовательский интерфейс, потоки, GC, KVO, runloops при разветвлении?

Можно ли избежать создания автономного исполняемого файла, запускаемого через NSTask?

Если я запускаю отдельный процесс, как я могу отправлять и получать экземпляры объектов ObjC? (Я бы предпочел не сериализовать / не сериализовать их самостоятельно, и мне нужно сохранить их после завершения дочернего процесса).

Как OS X решает эту проблему для плагинов Spotlight и Quicklook?

Ответы [ 2 ]

2 голосов
/ 06 августа 2010

Возможно ли запустить fork () приложение Cocoa?

Да, но вам в значительной степени придется немедленно выполнить.Core Foundation выдаст исключение, если вы попытаетесь использовать определенные методы Какао или функции CF между fork и exec (или вообще без execking).Вы могли бы сойти с рук с некоторыми вещами (например, я смог спросить у окна его фрейм), но ничто не безопасно.

Запуск NSTask, конечно, считается вместе форком и exec, предотвращая проблемыпропуска или откладывания exec.

Как будут работать пользовательский интерфейс, потоки, GC, KVO, runloops при разветвлении?

Пользовательский интерфейс: Windows (реальные наэкран) не дублируются.Конечно, вы все равно не можете общаться с объектами NSWindow и NSView.

Потоки: не переносятся в подпроцесс. Это не так хорошо, как может показаться , так как проблемных случаев предостаточно;для одного другой поток мог бы удерживать блокировку в родительском элементе, который остается заблокированным в дочернем элементе, даже если поток, в котором он находился, отсутствует.

GC: Ну, сборщик мусора работает в потоке…

KVO: Должно быть в порядке, поскольку наблюдение обычно запускается либо явно, либо с помощью средств доступа к оболочке, предоставляемых KVO.

Циклы выполнения: по одному на поток, поэтому цикл выполнения основного потока все еще должен существовать, но онумрет, если вы вернетесь к нему.

Можно ли избежать создания автономного исполняемого файла, запускаемого через NSTask?

Нет.

Если я запустлюотдельный процесс, как я могу отправлять и получать экземпляры объектов ObjC?

Если вы не исполняете, вы не делаете.

В противном случае вы можете использовать DO.

(я бы предпочел не сериализовать / не сериализовать их самостоятельно, и мне нужно сохранить их после завершения дочернего процесса).

Затем вам нужно будет сделать копию вродительский процесс.Я не знаю, можете ли вы использовать copyWithZone: здесь;возможно нет.Я подозреваю, что вам придется выполнить некоторую сериализацию / десериализацию на основе plist или архива.

Как OS X решает эту проблему для плагинов Spotlight и Quicklook?

Прожектор имеет mdworker;Quick Look имеет что-то похожее.

1 голос
/ 05 августа 2010

Я использую Распределенные объекты для связи между моей программой какао и отдельной (ненадежной) рабочей программой.Я начинаю рабочий как NSTask.Распределенные объекты очень элегантно сложены вместе.

...