2009-07-31 1 views
22

클래스가있는 경우 인스턴스 변수 이름을 모두 나열하려면 어떻게해야합니까?Objective-C에서 개체의 모든 필드를 어떻게 나열합니까?

예 :

@interface MyClass : NSObject { 
    int myInt; 
    NSString* myString; 
    NSMutableArray* myArray; 
} 

나는 "민트", "mystring에"및 "에서 myArray"을 좀하고 싶습니다. 아마도 반복 할 수있는 배열을 얻을 수있는 방법이 있을까요?

Objective-C 문서를 검색해 보았지만 아무 것도 찾을 수 없었습니다 (그리고이 이름이 무엇 인지도 모릅니다).

+0

당신은 소스 코드에서 작업 (이 경우 당신이 목표 - C 파서 필요를) 또는 런타임 중에 (Objective-C 런타임 API를 사용할 수 있습니다)? –

+0

소스 코드, 즉 변수는 런타임 중에 변경되지 않고 모두 소스 코드에 정의됩니다. plist에 쓰는 일반적인 함수를 작성하려고합니다. NSDictionary를 사용할 수 있다는 것을 알고 있지만 새 클래스 변수를 추가 할 때 코드를 수동으로 추가하지 않으려합니다. 따라서 질문이 생깁니다. –

+0

그러면 실제로 런타임에 소리가 나는 것처럼 들립니다. –

답변

40

언급 한 바와 같이, 인스턴스 변수 이름 검색 할 오브젝티브 C 런타임 API를 사용할 수 있습니다

unsigned int varCount; 

Ivar *vars = class_copyIvarList([MyClass class], &varCount); 

for (int i = 0; i < varCount; i++) { 
    Ivar var = vars[i]; 

    const char* name = ivar_getName(var); 
    const char* typeEncoding = ivar_getTypeEncoding(var); 

    // do what you wish with the name and type here 
} 

free(vars); 
+0

감사합니다. –

+3

당신도 이것을 필요로합니다 : #import

+0

이것이 NSManagedObject에서 작동하지 않는 이유는 무엇입니까? –

0

gen_bridge_metadata은 전혀 다른 용도로 사용되지만 Objective-C 헤더 파일에서 XML 파일을 생성 할 수 있습니다.

1
#import <objc/runtime.h> 


NSUInteger count; 
Ivar *vars = class_copyIvarList([self class], &count); 
for (NSUInteger i=0; i<count; i++) { 
    Ivar var = vars[i]; 
    NSLog(@"%s %s", ivar_getName(var), ivar_getTypeEncoding(var)); 
} 
free(vars); 
+1

무료 (vars)를 추가해야합니다. 위의 @JHH와 같거나 메모리 문제가 있습니다. – amergin