2011-09-27 4 views
1

개체의 변수에 대해 하나의 질문이 있습니다. 문자열이 개체의 인스턴스 변수인지 여부를 확인할 수 있는지 알고 싶습니다.문자열이 객체의 인스턴스 변수인지 확인하는 방법은 무엇입니까?

@interface MyObject : NSObject 
{ 
    //Variables 
    id myVariable1; 
    id myVariable2; 

} 
@property (nonatomic, retain) id myVariable1; 
@property (nonatomic, retain) id myVariable2; 

그리고 나는 또한 배열 목록이 있습니다 :

NSArray * myArray = [[NSArray alloc] initWithObjects:@"myVariable1",@"myVariable2",@"myVariable3",@"myVariable4",nil]; 

내가 알고 싶습니다을 MyObject.h - 나는 객체가

: 다음은, 예를 들어 내 문제를 설명하기 위해 배열 목록의 어느 문자열이 객체 MyObject의 변수로 정의되지 않았는지 결정할 수 있다면 가능합니다.
=>이 경우에는> myVariable3 및 myVariable4입니다.

난 당신이 내 문제 : 내가 만들 것

+0

이것은 인스턴스와 아무런 관련이 없습니다! 내 첫 수정이 잘못되어 "메소드가"특정 속성 (또는 메소드)의 이름 일 뿐이므로 "객체가 특정 * 속성 *을 가지고 있는지 확인하는 방법"- "* 인스턴스가 아닌"*을 묻는 것입니다. , 나에 (게) oops, 손가락 너무 빠르다). 이에 따라 업데이트하십시오. –

+0

아마도 "인스턴스 변수"가 아닌 "인스턴스 이름"을 의미 할 것입니다. – AliSoftware

+0

원래의 게시물을 편집하여 실제로 의미가 무엇인지 더 잘 반영 할 수 있습니다. – jlehr

답변

2

, 당신은 할 수 :

MyObject *object = ...; 
for (NSString *name in myArray) { 
    SEL getterName = NSSelectorFromString(name); 
    if ([object respondsToSelector:getterName]) { 
    NSLog(@"MyObject has a method named %@", getterName); 
    } else { 
    NSLog(@"MyObject does not have a method named %@", getterName); 
    } 
} 
+0

이것은 좋은 해결책입니다. 이것은 노출 된 ivars에서만 작동합니다. – Eimantas

+0

@Eimantas 당신은 무엇을 의미합니까? 이것은 ivar이 아니라 메소드의 존재 여부를 검사하는 것이며 메소드가 개인 범주로 선언되었는지 여부에 관계없이 작동합니다. 아무것도 런타임에서 안전하지 않습니다 ...;) –

+2

OP는 인스턴스 변수에 대해 묻습니다. 인스턴스 변수를 선언했지만'@ property' 문이나 커스텀 getter를 통해 노출시키지 않으면이 접근법으로 객체 외부에서 그것을 "감지"할 수 없습니다. – Eimantas

1

를 해결하기 위해 몇 가지 조언이 있으면 알려주세요 ... 성공하지 "isKindOfClass을", "isMemberOfClass", "valueForKeyPath", "valueForKey"하지만 사용하려고 NSClassFromString 클래스를 사용하여 비교에 사용할 객체입니다. 속성 사용자 정의 세터 이름을 사용하지 않는 가정

if ([myClass isKindOfClass:NSClassFromString(myClassString)] { 
    // class matches string 
} else { 
    // class doesn't match 
} 
0

그것은 배열의 값이 어떤 객체의 속성입니다 있는지 확인하는 것이 더 쉽습니다. 귀하의 경우와 마찬가지로 valueForKey:myInstance1myInstance2이 0이 아닌 객체 인 경우에만 작동해야합니다. nil을 반환하려면 - (id)valueForUndefinedKey: 메서드를 구현해야하며 모든 것이 훌륭하고 멋쟁이 일 것입니다.

object_getInstanceVariable 메서드를 사용하여 배열을 반복하면서 각 인스턴스 변수를 개별적으로 가져올 수도 있습니다. 선언되지 않은 인스턴스는 NULL 포인터를 반환해야한다고 생각합니다 (선언되었지만 정의되지 않은 인스턴스 인 nil과 반대).

관련 문제