Что такое динамическое создание? - PullRequest
2 голосов
/ 10 мая 2011

Я недавно читал о динамическом создании как об одном из шаблонов проектирования в Какао. Однако я не очень понимаю, как это работает. Поэтому мне нужны разъяснения от вас, кто реализовал ваш дизайн.

  1. Что это? Почему и когда вы будете использовать этот шаблон дизайна?
  2. Я прочитал, что вы используете NSClassFromString() для доступа к классу. Я предполагаю, что использую это, когда хочу использовать класс, который не существует в проекте, над которым я работаю. Обычно, когда я хочу использовать определенный класс, я импортировал их в заголовок. При таком подходе пропускается процесс #import?

    Class JavaArrayList = NSClassFromString(@"java.util.ArrayList");
    

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

    JavaArrayList *foo = [[JavaArrayList alloc] init];
    [foo useMethodBelongJava:doWhateverTask];
    
  3. Каковы преимущества использования этого шаблона проектирования? Особенно в разработке iPhone.

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Ваш пример использует этот шаблон для создания экземпляра Java-класса. В старые времена (до MacOS 10.4, я думаю) у Apple была какая-то технология, называемая Cocoa-Java Bridge, которая позволяла использовать классы Java в коде Objective-C. Вы должны были создать их экземпляры указанным способом, потому что у них не было заголовочных файлов Objective-C для импорта.

Однако, что касается Snow Leopard, Java Bridge больше не существует, поэтому код в вашем вопросе больше не будет работать.

Рекомендуемое решение для вызова Java-класса из Objective-C теперь JNI . Посмотрите на этот вопрос , если вы пытаетесь это сделать.

  1. Что это? Почему и когда вы будете использовать этот шаблон дизайна?

Возвращаясь к NSClassFromString, у него есть и другие применения, помимо создания экземпляров классов Java (что, как я уже говорил, больше не работает!). Например, недавно я написал библиотеку для анализа ответа от веб-службы. Чтобы заставить его работать с различными веб-сервисами, я прочитал его в файле конфигурации, в котором описывался ожидаемый формат данных. Для каждого поля в веб-сервисе мой конфигурационный файл указал, какой класс Cocoa нужно создать. Таким образом, в моем коде у меня было имя класса Какао в виде строки. Чтобы создать экземпляр объекта, который я хотел, я использовал NSClassFromString, чтобы превратить его в объект Class.

  1. Обычно, когда я хочу использовать определенный класс, я импортировал их в заголовок. При таком подходе пропускается процесс #import?

Это можно сделать. NSClassFromString создаст экземпляр любого класса, который присутствует во время выполнения, поэтому вам не нужен заголовок, чтобы иметь возможность его использовать. Если у вас нет заголовка, вы получите кучу предупреждений «возможно, не отвечает селектору» всякий раз, когда вы пытаетесь использовать ваш недавно созданный экземпляр класса, поскольку у компилятора недостаточно информации, чтобы быть полезным. Однако во многих случаях, когда NSClassFromString полезен, файлы заголовков недоступны.

0 голосов
/ 10 мая 2011

См. Эту ссылку: нужно сообщить о NSClassFromString

Единственным реальным преимуществом для iPhone была возможность ссылаться на классы из более новых API и по-прежнему ориентироваться на старые API.Начиная с 4.0 вы можете сделать это в любом случае, установив цель развертывания вашего проекта.Я не вижу никакой причины, по которой вы бы больше использовали его для программирования на iPhone.

Это будет работать только для классов класса C.Вы не можете импортировать Java-объекты в приложение для iPhone.

...