2010-10-18 4 views
0

Я не уверен, правильно ли сформулировал тему. Я перебираю массив, внутри каждого цикла я пытаюсь создать экземпляр класса, но я хочу динамически создать имя. Как так:Objective-c: Динамические имена классов

int i = 0; 

for(NSString* thisdatarow in filedata) { 
    i++; 
    NSString* thisad = [NSString stringWithFormat:@"ad%d", i]; 
    NSLog(@"%@", thisad); 
    AdData* thisad = [AdData new]; 
} 

В приведенном выше примере я хочу AdData * thisad ... будет называться динамически - "AD1", "ad2", "AD3" ... и так далее. Я получаю ошибку противоречивого типа.

Этот код также генерируется сообщение об ошибке:

int i = 0; 
for(NSString* thisdatarow in filedata) { 
    i++; 
    AdData* [NSString stringWithFormat:@"ad%d", i] = [AdData new]; 
} 

Есть ли способ сделать это?

+1

Какая у вас наибольшая цель? Возможно, я смогу сделать то, что вы просите, но вполне вероятно, что есть намного лучший способ сделать это. – kubi

ответ

2

Вы не можете сделать это в Objective-C.

Используйте карту NSString для AdData - это будет в основном то же самое!

** Редактирование: Для уточнения, используйте:

NSMutableDictionary *dict; 

с ключами, которые NSString * объекты, содержащие имена объявлений, а также значение, которые являются AdData * объектами.

т.е.

[dict setValue:ad1 forKey:@"ad1"]; 

, чтобы установить значения, и

[dict valueForKey:@"ad1"]; 

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

+0

Спасибо всем, это очень помогает. – PruitIgoe

0

Cant быть сделано без использования массива C, который будет выглядеть следующим образом:

AdData **ad = malloc(sizeof(AdData) * numberOfAds); 
ad[1] = [AdData new]; 
// etc. 
if (ad) 
    free(ad); 

Но я не знаю, как это будет работать, так как классы Objective-C сохраняются ....

+0

, который должен быть 'sizeof (AdData *)' – newacct

2

Это невозможно. Хотя Objective-C очень динамичен, это не , что динамический.

Предлагаемый способ сделать это - создать ваши экземпляры и поместить их в массив, а не назначать их явно указанным переменным.

Затем вы можете обращаться к ним индивидуально, используя свой индекс в массиве.

Что-то вроде этого:

NSMutableArray *ads = [NSMutableArray array]; 

for(NSString* thisdatarow in filedata) { 
    AdData* thisad = [[[AdData alloc] init] autorelease]; 
    [ads addObject:thisad]; 
} 

// get third ad: 
AdData *ad = [ads objectAtIndex:2]; 

В качестве альтернативы вы можете создать NSDictionary, если вы действительно хотите, чтобы обращаться к ним по имени, например:

NSMutableDictionary *ads = [NSMutableDictionary dictionary]; 
int i = 0; 

for(NSString* thisdatarow in filedata) { 
    i++; 
    AdData* thisad = [[[AdData alloc] init] autorelease]; 
    NSString *keyName = [NSString stringWithFormat:@"ad%d", i]; 
    [ads setObject:thisad forKey:keyName]; 
} 

// get third ad 
AdData *ad = [ads objectForKey:@"ad2"]; 
+0

Это правильно, но счетчик 'i' бесполезен, если вы просто добавляете массив. – Chuck

+0

Вы правы, я просто скопировал пример кода из исходного вопроса и не удалял его. – Jasarien

+0

Я получаю эту работу до этой строки: AdData * ad = [ads objectForKey: @ "ad2"]; это сбой моего приложения. – PruitIgoe

0

Локальные имена переменных чисто концепция компиляции. Таким образом, вы не можете делать что-либо «динамическое» (то есть во время выполнения) с ним. Компилятор может свободно переименовывать переменные и добавлять или удалять переменные по своему усмотрению.

Если вы думаете об этом, то в чем смысл динамического манипулирования именами локальных переменных?Чтобы снова использовать динамически названную переменную, вы должны либо 1) явно ссылаться на имя переменной, и в этом случае у вас жестко закодированное имя (не так динамично), либо 2) динамически снова создайте это имя. Если это (1), то существует только фиксированный набор имен переменных, поэтому динамическая необходимость не нужна. Если это (2), вам не хватает точки локальных имен переменных (вся суть которой заключается в том, что они могут быть явно указаны).

Смежные вопросы