2010-08-13 4 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

의 모든 형태를 포함 할 수 당신이 당신의 XML 코드에서 구문 분석하는 NSString, 당신 클래스 이름이 그런 것처럼 보일 경우 NSString 대문자 사용 메서드를 사용할 수 있습니다. 설명하는 일반적인 함수는 사용할 수 없으며 클래스 이름이 대/소문자를 구분하지 않는다는 간단한 이유 때문에 유용하지 않을 수 있습니다.

@interface Person : NSObject 
{ 

} 

@end 

@interface PERSON : NSObject 
{ 

} 

@end 

은 작동하고 두 개의 다른 클래스 유형을 선언합니다. 솔직히 말해서, 대소 문자를 제외한 동일한 이름의 클래스를 갖는 것은 처음에는 나쁜 스타일 일 것입니다.

+0

고마워, 나는 내 자신의 대소 문자를 구분하지 않는 matcher를 작성해야 할 것 같아. –

6

후는 NSString (예를 들어 -capitalizedString)의 자본화 방법 중 하나를 사용하여있는 NSString 케이스를 구분하기 NSClassFromString

편집에 대한 PARAM로 사용 : 여기에 코드 예를 들어, 무엇인가에 대한 것은 허용 Person 예제를 기반으로합니다. (stringFromXML 가정하면 objc_getClassList

+1

camelCased 클래스 이름이없는 경우에만 작동합니다. – cobbal

+0

예, 그렇습니다. 그렇다면 귀하의 답변이 유일한 실행 가능한 솔루션입니다. 나는 낙타에 대한 언급을 보지 못했고 단순한 이름이 될 것이라고 예를 들었다. :) –

+0

Thanks Jesse. 그러나 나는 카멜 케이스 클래스 이름을 지원해야합니다. 답변을 고맙게 생각합니다! –

1

에서 얻을 수있는 당신은 아마 클래스 목록을 검색 붙어있는 단어 "사람"

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

제발하지 마세요. 당신은 임의적 인 (HTTP를 통해 다운로드되었다고 가정합니다) XML은 앱에 임의의 클래스를 인스턴스화합니다. 이것은 나쁜 것이며, 을 알기가 어렵습니다.의 모든 클래스가 애플리케이션 (개인 프레임 워크의 클래스 포함)에로드 될 수 있기 때문에 잘못되었습니다.

또한 이름은 대소 문자를 구분 있어야되는 XML 태그를주의

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

같은 것을 사용하는 것이 좋습니다.

+2

+1 여기에 보안 메모. 가능한 모델 클래스 목록을 명시 적으로 범위를 지정하십시오. –

+0

+1 정말 좋은 방법입니다. – cobbal

+0

입력으로 명명 된 클래스를 인스턴스화 할 때의 보안 함의가 학문이라고 생각하지 않도록 [이것은 Ruby on Rails의 사람들을 정말로 무찔 렀습니다] (http://blog.codeclimate.com/blog/2013/01/10/rails-remote-code-execution-vulnerability-described /)를 참조하십시오. –

관련 문제