Search
🏀

[Objective-C] reflection(리플렉션), Introspection(인트로스펙션) Runtime 메소드 사용하기

생성일
2021/05/27 05:47
태그
iOS
Best Practice
속성
속성 1
속성 2
2021/07/15 15:37

Reflection

Objective-C에서 자바의 Reflection 에 해당하는 기능을 Introspection(인트로스펙션) 이라고 합니다.이 기능들은 <objc/runtime.h> 헤더 파일에 선언되어 있으며, C 함수로 작성되어 있습니다.
사용할 수 있는 메소드는 애플 개발자 센터 가이드에서 확인 가능합니다.애플 개발자 센터 Runtime 개발 가이드가이드 문서에서 확인할 수 있듯이 수십여 가지의 메소드로 다양한 인스트로펙션 기능을 제공하고 있습니다.
Introspection을 이용해서 다양한 기능을 구현할 수 있습니다.
1.
특정 객체가 특정 Protocol, Method이 있는지 조사하여 앱 크래시 방지
2.
외부 API Response로 내려온 json, XML 등을 Object Model 에 매핑할 때

Instropection을 이용한 XMl Object Mapper 구현예제

스터디용으로 공공데이터를 이용한 앱을 만드는 작업을 하고 있는데, 대부분의 Response형태가 XML로 되어 있습니다. json 이면 좋을텐데 ㅠㅜNSXMLParser로 XML Object Mapper 구현하기 (공공데이터 Response 파싱하기) 포스트 보러가기

Parser에서 사용한 Instropection

class_copy_PropertyList(Class, int *)

OBJ-C 1 int propertiesCount = 0;2 objc_property_t *properties = class_copyPropertyList(objectClass, &propertiesCount);3
Plain Text
복사
objectClass클래스가 가진 objc_property_t 구조체들을 array로 리턴하며 배열 갯수는 propertiesCount에 담겨집니다.이렇게 반환된 properties 변수는 나중에 반드시 free(properties) 호출되어야 합니다.

property_getName(objc_property_t)

OBJ-C 1 const char *cname = property_getName(property);2 NSString *name = [NSString stringWithUTF8String:cname];3
Plain Text
복사
프로퍼티의 이름 (클래스) 이름을 const char 타입으로 리턴합니다.NSString의 stringWithUTF8String을 통해 NSString으로 wrapping 가능 합니다.