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

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

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

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


person Coocoo4Cocoa    schedule 19.12.2008    source источник


Ответы (4)


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

id obj = [[NSClassFromString(@"MySpecialClass") alloc] init];
person codelogic    schedule 19.12.2008

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

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

Class classForElement = [MyUserClass class];

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

id newObject = [[classForElement alloc] init];

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

[NSDictionary dictionaryWithObjectsAndKeys:
                         [MyUserClass class], @"user", 
                         [MyCarClass class], @"car", 
                         [MyHomeClass class], @"home",
                          nil]];
person Nathan Kinsinger    schedule 19.12.2008

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

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

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

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

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

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

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

person Stephan Eggermont    schedule 19.12.2008
comment
Обратите внимание на тег какао-тач. Core Data не существует на iPhone. - person Peter Hosey; 19.12.2008
comment
Тем не менее, он предлагает решение. Воссоздать минимальное подмножество - person Stephan Eggermont; 19.12.2008

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

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

person lostInTransit    schedule 27.12.2008