Objective-c:动态类名

时间:2010-10-18 17:54:26

标签: objective-c class instantiation

我不确定我是否正确地说明了这个主题。我循环遍历数组,在每个循环中我试图实例化一个类,但我想动态创建名称。像这样:

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];
}

有办法做到这一点吗?

4 个答案:

答案 0 :(得分:2)

你不能在Objective-C中这样做。

使用NSString到AdData地图 - 它基本上会做同样的事情!

**编辑:澄清一下,使用:

NSMutableDictionary *dict;

使用包含广告名称的NSString *对象的键,以及作为AdData *对象的值。

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

设置值,

[dict valueForKey:@"ad1"];

获取值。 (忽略字符串明显的内存泄漏......)

答案 1 :(得分: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"];

答案 2 :(得分:0)

不能使用C数组,如下所示:

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

但由于Objective-C类的存储方式,我不知道它是如何工作的。

答案 3 :(得分:0)

本地变量名称是纯粹的编译时概念。所以你不能用它做任何“动态”(即在运行时)。编译器可以自由地重命名变量,并根据需要添加或删除变量。

如果你考虑一下,动态操作局部变量名的重点是什么?为了再次使用动态命名变量,您必须1)显式引用变量名称,在这种情况下,您对名称进行了硬编码(不是那么动态),或者2)再次动态构造名称。如果它是(1),那么只有一组固定的变量名,所以动态性是不必要的。如果它是(2),那么你就错过了局部变量名的要点(其全部意义在于它们可以明确地引用)。