Столкновения плагинов Какао / Objective-C - PullRequest
5 голосов
/ 14 июня 2011

Мое приложение имеет систему плагинов, которая позволяет моим пользователям писать свои собственные плагины, которые загружаются во время выполнения.Обычно это нормально, но в некоторых случаях два плагина используют одни и те же библиотеки, что вызовет конфликт между этими двумя.

Пример:

Плагин A хочет использовать TouchJSON для работы с JSON и, таким образом, создатель добавляет код TouchJSON в исходный код плагина, который компилируется и связывается с двоичным файлом плагина.Позже Плагин B также хочет использовать ту же библиотеку и делает то же самое.Теперь, когда мое приложение загружает эти два разных плагина, оно обнаруживает это и выдает следующее предупреждение:

Класс CJSONScanner реализован как в [path_to_plugin_a], так и в [path_to_plugin_b].Один из двух будет использован.Какой из них не определен.

Поскольку мое приложение просто загружает плагины и проверяет их соответствие определенному протоколу, я не могу контролировать, какие плагины загружаются, и если два или более используют ту же библиотеку.

Пока оба плагина используют одну и ту же версию библиотеки, это, вероятно, будет работать, но как только API изменится в одном плагине, возникнет куча проблем.

Могу ли я что-нибудь сделатьоб этом?

Ответы [ 2 ]

4 голосов
/ 14 июня 2011

Система загрузки пакетов не дает возможности для мирного разрешения конфликтов имен.На самом деле, нам говорят , чтобы убедиться, что проблема не возникает , а не что делать, если это произойдет.(Очевидно, в вашем случае это невозможно).

Вы можете подать отчет об ошибке с этой проблемой.

Если это абсолютно критично для вашего приложения, выВозможно, вы захотите, чтобы комплекты работали в отдельных процессах и использовали какой-то IPC, возможно NSDistantObject, для передачи данных из вашей программы хостам плагинов.Тем не менее, я вполне уверен, что это мешает, поэтому, если у вас нет четко определенных интерфейсов, позволяющих распределять их по различным процессам, это может оказаться довольно трудным делом.

2 голосов
/ 14 июня 2011

В модели с одним процессом единственный способ справиться с этим - убедиться, что общий код (точнее, общие классы Objective-C) загружается один раз.Есть два способа сделать это:

  • Поместить общий код в платформу.
  • Поместить общий код в загружаемый пакет и загрузить пакет, когда подключаемый модульзагружается, если соответствующие классы еще не доступны (проверьте, используя NSClassFromString()).Клиентский код также должен был бы использовать NSClassFromString() вместо прямой ссылки на классы.

Конечно, если вы не контролируете плагины, вы не можете применить ни один из этихсхем.Лучшее, что вы можете сделать, это предоставить соответствующие рекомендации и, возможно, инфраструктуру;например, во втором случае загрузка может быть обработана приложением, возможно, путем указания класса для проверки и имени встроенного пакета для загрузки, если он не доступен в Info.plist плагина.

...