Подтвердить что ты не робот

Возможно ли динамическое создание классов в Objective-C?

Моя проблема в следующем. У меня есть метод, который просто берет фрагмент XML и XPath. Затем он должен создать мне массив объектов для этого фрагмента XML. Значение, если мне передают следующий XML:

<user>
  <name>Bob</name>
  <age>50</age>
</user>

Мой метод будет инстанцировать экземпляр класса User и использовать ключевое значение-кодирование для установки переменных экземпляра. Это довольно прямолинейно. Единственная проблема заключается в том, что я получаю, главным образом, скриптовый фон и пытаюсь выяснить, возможно ли передать метод имя класса. Сейчас он выполняет класс User, позже это может быть класс Cars, а затем класс Home. Каков наилучший способ создания объектов из этого метода разного типа, сохраняя при этом код максимально абстрактным?

4b9b3361

Ответ 1

Для создания экземпляра класса с использованием его имени вы можете использовать NSClassFromString:

id obj = [[NSClassFromString(@"MySpecialClass") alloc] init];

Ответ 2

Классы - это объекты и могут использоваться/отправляться так же, как и другие объекты.

Чтобы создать объект класса:

Class classForElement = [MyUserClass class];

Чтобы создать экземпляр объекта этого класса

id newObject = [[classForElement alloc] init];

Если имя класса не совпадает с именем элемента, создайте словарь с классом как объектом и именем элемента в качестве ключа.

[NSDictionary dictionaryWithObjectsAndKeys:
                         [MyUserClass class], @"user", 
                         [MyCarClass class], @"car", 
                         [MyHomeClass class], @"home",
                          nil]];

Ответ 3

Вы хотите подробно изучить Core Data. Управляемые объекты могут прийти на помощь.

В CocoaDevCentral есть несколько статей, но вам, вероятно, нужны документы Apple.

http://cocoadevcentral.com/articles/000086.php

[edit] Мне просто напомнили, что вы делаете это на iPhone. Недоступность базовой базы данных не означает, что вы не можете брать взаймы из нее и просто переопределять то, что вам нужно. Одна из OpenStep с открытым исходным кодом может иметь код.

На мобильном устройстве вы можете быть осторожны с размером ваших данных.

Эзра Эпштейн во время создания классов (и более):

http://www.macdevcenter.com/pub/a/mac/2002/05/24/runtime_partone.html

Ответ 4

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

Вы делаете проект для iPhone. Вы используете NSXMLNode. В случае, если вы, пожалуйста, имейте в виду, что использование NSXMLNode будет разрешено только на симуляторе. Он не будет работать на iPhone, поскольку NSXMLNode является частью основной библиотеки.