2010-08-13 128 views
3

我試圖從不同的XML源實例化類。這些來源的類名不一致(駱駝,上,下)。是否存在與此類似的NSClassFromString?例如,一些允許:NSClassFromString大小寫不敏感Objective-C

Person *person = [[NSClassFromCaseInsensitiveString("Person") alloc] init]; 
Person *person = [[NSClassFromCaseInsensitiveString("person") alloc] init]; 
Person *person = [[NSClassFromCaseInsensitiveString("PERSON") alloc] init]; 

回答

3

你可能堅持與搜索類列表,從獲得objc_getClassList

+0

謝謝,我想我必須寫我自己的不區分大小寫的匹配器。 – 2010-08-13 17:27:09

6

作出的NSString不區分大小寫通過使用任何在的NSString(-capitalizedString例如)資本化的方法,然後把它作爲參數有關NSClassFromString

編輯:這裏是代碼基於你的Person例子。 (假設stringFromXML是你從你的XML代碼解析的的NSString可能包含任何形式的「人」字

NSString *personString = stringFromXML; 
Person *person = NSClassFromString([personString capitalizedString]); 
+1

只有在您沒有駱駝班級名稱的情況下,此功能纔有效 – cobbal 2010-08-13 17:12:26

+0

是的,我同意,如果是這樣,您的答案是唯一可行的解​​決方案。我沒有看到提及駱駝,並從這個例子中假設它會是簡單的名字:) – 2010-08-13 17:14:49

+0

謝謝傑西。但是,我確實需要支持駱駝類的類名。雖然欣賞答案! – 2010-08-13 17:27:53

1

你可以使用NSString大小寫方法,如果你確保類名稱看起來像這樣,那麼你所描述的一般函數是不可用的,並且可能不會,因爲類名稱不區分大小寫的簡單原因

@interface Person : NSObject 
{ 

} 

@end 

@interface PERSON : NSObject 
{ 

} 

@end 

將工作並聲明兩種不同的類類型。儘管誠實地說,除了案例以外,具有相同名稱的課程首先是不好的風格。

3

請不要這樣做。你讓任意(我假設通過HTTP下載)XML在您的應用程序中實例化任意類。這是不好的,很難知道如何壞,因爲它可以實例化任何加載到您的應用(包括私人框架中的一個)的類。

考慮使用類似

NSDictionary * classesByLowercaseString = [NSDictionary dictionaryWithObjectsAndKeys: 
    [Person class], @"person", 
    [Blah class[, @"blah", 
    nil]; 
[classesByLowercaseString objectForKey:[xmlClassName lowercaseString]]; 

還要注意的是XML標籤名稱應該是區分大小寫的。

+2

此處爲安全提示+1。明確列出可能的模型類的列表。 – 2010-08-13 18:21:00

+0

+1真的是最好的出路 – cobbal 2010-08-13 22:37:58

+0

免得有人認爲通過輸入命名實例化類的安全含義是學術性的[[這確實是咬了Ruby on Rails人]](http://blog.codeclimate.com/blog/2013/01/10 /導軌-遠程代碼執行-漏洞的解釋/)。 – 2013-05-12 00:42:00