NSClassFromString不区分大小写的Objective-C。

3

我正在尝试从不同的XML源实例化类。这些源中,类名的大小写不一致(驼峰、大写、小写)。是否存在 NSClassFromString 的等效方法来解决这个问题?例如,是否有类似以下功能的方法:

Person *person = [[NSClassFromCaseInsensitiveString("Person") alloc] init];
Person *person = [[NSClassFromCaseInsensitiveString("person") alloc] init];
Person *person = [[NSClassFromCaseInsensitiveString("PERSON") alloc] init];
4个回答

6
使用NSString中的任何大写方法(例如-capitalizedString)使NSString不区分大小写,然后将其用作NSClassFromString的参数。
编辑:这里是基于您的“Person”示例的代码。(假设stringFromXML是您从XML代码中解析出来的NSString,其中可能包含任何形式的“person”单词)
NSString *personString = stringFromXML;
Person *person = NSClassFromString([personString capitalizedString]);

1
这只适用于您没有使用驼峰命名的类名。 - cobbal
是的,我同意。如果是这种情况,你的答案就是唯一可行的解决方案。我没有看到提到 Camel,所以从例子中假设它只是简单的名称 :) - Jesse Naugher
谢谢Jesse。不过,我确实需要支持驼峰式类名。还是感谢你的回答! - Kevin Sylvestre

3
请不要这样做。你让任意(我假设是通过HTTP下载的)XML在你的应用程序中实例化任意类。这是不好的,而且很难知道它有多糟糕,因为它可以实例化你应用程序中加载的任何类(包括私有框架中的类)。
考虑使用类似以下的东西:
NSDictionary * classesByLowercaseString = [NSDictionary dictionaryWithObjectsAndKeys:
  [Person class], @"person",
  [Blah class[, @"blah",
  nil];
[classesByLowercaseString objectForKey:[xmlClassName lowercaseString]];

请注意,XML标签名应该区分大小写。

2
在这里为安全性添加一个+1提示。明确列出可能的模型类别列表的范围。 - Ben Zotto
不要以为根据输入实例化命名的类的安全问题只是学术性的,这确实会影响到Ruby on Rails开发人员。详情请见:http://blog.codeclimate.com/blog/2013/01/10/rails-remote-code-execution-vulnerability-explained/。 - Peter Hosey

3

谢谢,我猜我得自己写一个不区分大小写的匹配器。 - Kevin Sylvestre

1

如果你可以保证类名看起来像那样,你可以使用NSString的大小写方法。像你描述的一般函数是不可用的,也很可能不会出现,因为类名不区分大小写。

@interface Person : NSObject  
{ 

} 

@end 

@interface PERSON : NSObject
{

}

@end

将会工作并声明两种不同的类类型。但说实话,除了大小写相同的类名只会是不好的风格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接