如果我创建了一个类的对象,我会这样做:
Item *item01 = [[Item alloc] init];
但我怎么给它一个字符串中的名字? (我提出这个问题是因为我必须在循环中执行此操作,并且对象的名称是动态的)
NSString *aString = [NSString stringWithFormat:@"%@", var];
Item *??? = [[Item alloc] init];
谢谢!
答案 0 :(得分:3)
您不能从字符串中获取变量名称。你想在这里实现什么?您可以使用字典从字符串键中查找变量。
检查此类question
答案 1 :(得分:2)
如果您想通过字符串的名称引用对象,您可以将对象存储在NSMutableDictionary中并将密钥设置为名称。
例如:
// Someplace in your controller create and initialize the dictionary
NSMutableDictionary *myItems = [[NSMutableDictionary alloc] initWithCapacity:40];
// Now when you create your items
Item *temp = [[Item alloc] init];
[myItems setObject:temp forKey:@"item01"];
[temp release];
// This way when you want the object, you just get it from the dictionary
Item *current = [myItems objectForKey:@"item01"];
答案 2 :(得分:1)
需要更改变量名称(Item *???
)非常不寻常 - 它通常是预处理程序滥用。
相反,我认为您可能希望按名称创建类型的实例。
要使用id
,Class
apis,NSClassFromString
的组合。
id
是指向未定义的objc对象的指针,编译器将“接受”任何声明的消息:
id aString = [NSString stringWithFormat:@"%@", var];
现在您可以请求aString
执行可能无法响应的选择器。对于objc类型,它类似于void*
。请注意,如果使用不响应的选择器向id
变量发送消息,则会收到运行时异常。
接下来,Class
类型:
Class stringClass = [NSString class];
NSString * aString = [stringClass stringWithFormat:@"%@", var];
将所有这些结合起来按名称创建一个类型的实例:
NSString * className = [stringClass stringWithFormat:@"%@", var];
Class classType = NSClassFromString(className);
assert(classType && "there is no class with this name");
id arg = [[classType alloc] init];