具有字符串名称的对象

时间:2011-05-28 20:17:49

标签: objective-c cocoa

如果我创建了一个类的对象,我会这样做:

Item *item01 = [[Item alloc] init];

但我怎么给它一个字符串中的名字? (我提出这个问题是因为我必须在循环中执行此操作,并且对象的名称是动态的)

NSString *aString = [NSString stringWithFormat:@"%@", var];
Item *??? = [[Item alloc] init];

谢谢!

3 个答案:

答案 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 *???)非常不寻常 - 它通常是预处理程序滥用。

相反,我认为您可能希望按名称创建类型的实例

要使用idClass 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];