> iPhone-iPad, Objective-C > Objective-c 런타임에 인스턴스의 XML 생성.

Objective-c 런타임에 인스턴스의 XML 생성.

최근에 인스턴스를 XML 또는 Json으로 파싱하는 모듈을 만들어 볼 계획이였습니다. 그런데, 만들어지는 클래스에서 모두 makeXML과 같은 메소드를 재구성하는 것은 굉장히 심한 코드 노가다를 해야 합니다. 그래서 런타임에 프로퍼티 이름과 밸류를 가져와서 XML을 만드는 방법을 생각했습니다.

지금부터 몇개의 사이트의 내용을 참고해서, 위 내용에 대한 샘플 코드를 만들어 보겠습니다.
우선, makeXML 메소드를 갖는 슈퍼클래스를 만들어 보겠습니다.
이 슈퍼클래스의 이름은 OBJTest 입니다.

 
/*선언*/ 
 @interface ObjTest : NSObject { } 
  - (NSString *)makeXML; 
 @end 

/*구현*/ 
 #import <objc/runtime.h> 

 @implementation ObjTest // 클래스의 디클레어드 프라퍼티 목록. 
  - (NSMutableArray *)getPropertyList:(NSString *)className { 
   unsigned int outCount; 
   objc_property_t *properties = class_copyPropertyList([NSClassFromString(className) class], &outCount); 
   NSMutableArray *propertyArray = [[NSMutableArray alloc] init]; 
   while (outCount--) { 
    objc_property_t property = properties[outCount]; 
    [propertyArray addObject:[[NSString alloc] initWithFormat:@"%s", property_getName(property)]]; 
   } 
   return propertyArray; 
  } 

  - (NSString *)makeXML { 
   NSMutableArray *pts = [self getPropertyList:@"ObjTest01"]; 
   NSString *baseForm = @"%@"; 
   NSString *innerXML = @""; 
   for (NSString *pt in pts) { 
    innerXML = [innerXML stringByAppendingFormat:@"%@", pt, [self valueForKey:pt], pt];
   } 
   return [NSString stringWithFormat:baseForm, innerXML]; 
  } 
  @end 
 

위 내용 중에서 getPropertyList 메소드는
‘LambertPark: [Objective-C Runtime] 클래스의 디클레어드 프라퍼티 목록 확인 용 메소드’
아티클을 참조했습니다.

거의 모든 내용이 위에 담겨 있습니다. getPropertyList에서 objc_property_t를 이용해서 런타임 상황에서 클래스의 프로퍼티 리스트를 받아옵니다. objc_property_t를 사용하기 위해서 objc/runtime.h 를 임포트합니다.
이렇게 받아온 프로퍼티의 이름을 이용해서 makeXML 메소드에서 프로퍼티 이름과 해당 프로퍼티의 밸류값을 valueForKey 메소드를 이용해서 가져와서 XML을 생성합니다. (XML을 생성하는 것이 다소 무식해 보이네요.)

그럼 이 슈퍼 클래스를 상속받은 클래스를 작성해 보겠습니다.

 
/*선언*/ 
 @interface ObjTest01 : ObjTest { 
  int pkid; 
  NSString *name; 
  NSString *tel; 
  ObjTest01 *obj1; 
 } 
 @property(assign, readwrite) int ID; 
 @property(retain, nonatomic) NSString *Name; 
 @property(retain, nonatomic) NSString *Tel;  
 @property(retain, nonatomic) ObjTest01 *OBJ1; 
 @end 
/*구현*/ 
 @implementation ObjTest01 
  @synthesize ID = pkid; 
  @synthesize Name = name; 
  @synthesize Tel = tel; 
  @synthesize OBJ1 = obj1; 
 @end 
 

위에서 보신 것과 같이 ObjTest를 상속 받은 ObjTest01을 만들었습니다. 이렇게 만든 ObjTest01 인스턴스를 이용해서 makeXML을 호출하면 ObjTest01에서 별다른 처리 없이 XML 문자열을 뽑아낼 수 있습니다.
아래 내용은 간단한 검증 코드입니다.

  
 ObjTest *ab = [[ObjTest01 alloc]init]; 
 [ab setValue:[NSNumber numberWithInt:31] forKey:@"ID"]; 
 [ab setValue:@"Jongryong" forKey:@"Name"]; 
 [ab setValue:@"010-1213-1213" forKey:@"Tel"]; 
 [ab setValue:nil forKey:@"OBJ1"]; 
 NSLog(@"XML Data \n%@", [ab makeXML]); 
 

이상 런타임 코드를 이용해서 동적으로 XML을 자동 구성하는 클래스를 만들어 보았습니다. 이제 프로퍼티만 잘 정의하면 인스턴스에서 쉽게 XML구조를 뽑아낼 수 있습니다. 물론, 런타임관련 내용은 위와 같은 응용말고도 아주 많습니다. 자세한 내용을 더 보고 싶으면 애플의 라이브러리를 이용해 보면 되겠습니다. 링크 -> Objective-C 런타임 레퍼런스

  1. 댓글이 없습니다.
  1. No trackbacks yet.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: