我不确定我是否正确地说明了这个主题。我循环遍历数组,在每个循环中我试图实例化一个类,但我想动态创建名称。像这样:
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];
}
有办法做到这一点吗?
答案 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),那么你就错过了局部变量名的要点(其全部意义在于它们可以明确地引用)。