Динамически мгновенные занятия в Objective-C, возможно? - PullRequest
21 голосов
/ 19 декабря 2008

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

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

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

Ответы [ 4 ]

54 голосов
/ 19 декабря 2008

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

id obj = [[NSClassFromString(@"MySpecialClass") alloc] init];
23 голосов
/ 19 декабря 2008

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

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

Class classForElement = [MyUserClass class];

Для создания экземпляра объекта этого класса

id newObject = [[classForElement alloc] init];

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

[NSDictionary dictionaryWithObjectsAndKeys:
                         [MyUserClass class], @"user", 
                         [MyCarClass class], @"car", 
                         [MyHomeClass class], @"home",
                          nil]];
1 голос
/ 19 декабря 2008

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

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

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

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

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

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

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

0 голосов
/ 27 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...