2013-05-26 5 views
2

문제가 있습니다.ObjectiveC에서 개체를 만들려면 "변수 값"을 클래스 이름으로 사용하는 방법?

개체의 값을 사용하여 변수를 만들고 싶습니다.

예를 들어, 나는 변수 myVar 있습니다.

If myVar == 'Client' : myVar* obj (obj will be an Client instance) 
If myVar == 'People' : myVar* obj (obj will be an People instance) 

누군가가 도와 줄 수 있습니까? (내 영어 죄송합니다)

+0

당신은 Client''와 myVar에 비교되어있다. 왜 당신의'obj'의 조건부 생성을 사용하지 않을까요? –

+0

아니요, 비교하지 않습니다. 설명을위한 것입니다. 매개 변수에 문자열이있는 함수가 있습니다. 내 문자열의 값을 사용하여 객체를 만들고 싶습니다. – user2421041

답변

6

당신은 문자열에서 클래스를 얻기 위해 NSClassFromString(@"ClassName")을 사용합니다. 클래스의 인스턴스를 얻으려면 allocinit을 호출합니다. 예를 들면 :

NSString *myString = [NSClassFromString(@"NSString") alloc] init]; 

당신은 당신이 NSClassFromString에 전달 될거야, 또는 다른 변수에 전달하려면, 당신과 같이, 유형 id을 사용할 수있는 클래스 확실하지 않은 경우 :

id myObject = [NSClassFromString(myVar) alloc] init]; 

당신은 나중에 myObject을 캐스트, 또는 해당 클래스의 속성과 메서드에 대한 코드 완성을 지원하는 엑스 코드를 원하는 경우, 입력 된 변수에 할당 할 수 있습니다.

당신은 read more about NSClassFromString in the developer documentation을 할 수 있습니다.

편집 :

런타임 반성이 코드의 "깨지기 쉬운"자연 현상에 대해 여기에 무슨 다른 논의가있어 이후로, 내가 좀 더 설명하겠습니다. Objective-C 런타임은 문자열에서 클래스를 인스턴스화하는 것을 포함하여 모든 종류의 깔끔한 트릭을 지원합니다. 물론 당신은 처음에 기대했던 것과 같은 종류의 물건을 돌려받을 수 있어야합니다. 객체가 nil 경우 NSClassFromString에 의해 반환 된 클래스에서 개체를 인스턴스화 한 후 확인

가장 먼저하는 일이다. 그렇다면 NSClassFromString과 alloc 사이 또는 alloc과 init 사이에 문제가 발생했습니다. 당신의 문자열은 실제로 기존 클래스가 아닐 것입니다. 그래서,이 할 수있는 약간 안전한 방법은 지금과 같다 :

id myObject = nil; // Declare a myObject variable. Initialize to nil 
Class class = NClassFromString(myVar); 

if(!class) 
{ 
    // The class doesn't exist, we can't make the object 
} 
else 
{ 
    myObject = [[class alloc] init]; // You can also use [class new] if you're using a vanilla initializer 

    if(!myObject) 
    { 
    // myObject couldn't be created for some reason... 
    } 
    else 
    { 
    // You've got an instance of your class 
    } 
} 

내가 런타임이 굉장하기 때문에,하지만이 한 단계 더 걸릴 싶습니다.

주어진 개체가 어떤 방법을 수행 할 수 있는지 확인할 수도 있습니다. 그렇게하려면 respondsToSelector:을 살펴보십시오. Selector는 "메소드 이름"을 의미하며 본질적으로 문자열입니다. myObject 내부에 유효한 객체가 있다고 가정하면 myObject가 어떤 조치 (예 : show)를 수행 할 수 있는지 확인할 수 있습니다. 이 UIAlertView.h에 정의 된 유효한 방법은, 때문에

if([myObject respondsToSelector:@selector(show)]) 
{ 
    [myObject show]; // Safe to call `show` here 
} 
else 
{ 
    // Not safe, do something else! 
} 

나는 @selectorshow을 통과했습니다. 셀렉터의 존재 여부를 확신하지 못하면 어떻게 될까요? 글쎄, 우리는 클래스에서했던 것처럼 문자열로 selector를 만들 수 있습니다. 객체가 메소드를 구현하는 경우

SEL selector = NSSelectorFromString(@"myCustomMethod"); 

if ([myObject respondsToSelector:selector]) 
{ 
    [myObject performSelector:selector]; 
} 

우리는 선택을 생성, 확인, 그리고 그것을 않는 경우, 효과적으로 메소드를 호출 여기에 작동하는 방법.

난 당신이 당신이 기대했던 객체의 종류를 다시 가지고 있는지 확인해야한다고 말했다, 나는 객체의 클래스가 지정된 클래스와 동일한 경우 당신은 또한 런타임을 요청할 수 있음을 언급하는 것을 잊었다. 다음은 그 예입니다 : 더 자주

id myObject = [[NSClassFromString(@"UIView") alloc] init]; 

if([myObject isKindOfClass:[UIView class]]) 
{ 
    // We've got a UIView. Set a frame, install it in a hierarchy, or have a drink with it. 
} 
else 
{ 
    // Mayday! 
} 

다음하지, 당신은 클래스보다는 특정 행동에 대한 검사로 할 것입니다, 그러나 Class를 인스턴스화하고 작동하는지 확인하려고하는 것이 유용 할 수 있습니다. 이는 이전 버전의 iOS에서 이전 버전과의 호환성을 확인할 때 도움이됩니다.

희망이 도움이됩니다.

+0

아니요 ...이 인스턴스를 만들 수 없습니다. –

+0

그는 Client, Bus, Car ...의 형식을 원합니다. NSString이 아닙니다. 좋은 보이지만 유형 검사 필요 id' –

+0

그는 언급했다 클라이언트와 사람 –

관련 문제