Objective-C: загрузить «библиотеку», используя отражение - PullRequest
1 голос
/ 18 августа 2011

Мне поручено создать приложение с использованием XCode для OSX.Это приложение должно иметь возможность загружать и запускать отдельные «модули», которые будут определяться динамически (т. Е. Один пользователь мог приобрести модули 1 и 2, в то время как пользователь 2 купил бы модули 3 и 6 - должны запускаться только приобретенные модули)").

В C # я бы создал" библиотечный "проект (который компилируется только в DLL).Когда пользователь покупает модуль, я предоставляю соответствующие DLL-файлы, а затем мое приложение ищет и загружает / запускает DLL, используя отражение.

Что будет эквивалентно этому в XCode?Могу ли я создать «библиотеку», а затем загрузить ее с помощью отражения?Помните, что приложение не может предварительно знать модуль, поскольку в некоторых случаях пользователь даже не владеет файлами модуля.Я вижу различные варианты, такие как «Какао Framework» и «Библиотека какао», а также «Библиотека C / C ++».Что каждый из них делает и будет ли делать то, что мне нужно?

1 Ответ

3 голосов
/ 18 августа 2011

Вы можете создать комплект. У Xcode есть шаблоны для этого (он называется «Загружаемый комплект», а значок - это кирпичик Lego). Обычно вы загружаете пакет, используя NSBundle метод load.

Пример загрузки это будет:

- (BOOL)loadPluginAtURL:(NSURL *)URL {
  NSBundle *pluginBundle = [NSBundle bundleWithURL:URL];
  if (![pluginBundle load]) { // is false if pluginBundle == nil automatically.
    return NO;
  }
  id plugin = nil;
  @try { // Use @try-@catch in case the principle class doesn't respond to +alloc or -init. Otherwise the host application would crash and that kinda sucks.
    plugin = [[pluginBundle principalClass] alloc] init]; // Set the principle class in the bundle's info plist.
  } @catch (id e) {
    [bundle unload];
    return NO;
  }
  if (plugin) {
    [self.loadedPlugins addObject:plugin];// Define this as an NSMutableSet object.
    return YES;
  }
  [pluginBundle unload];
  return NO;
}

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

...