2012-01-31 1 views
2

런타임 방법을 사용하지 않고 객관적인 -c로 객체의 속성을 프로그래밍 방식으로 가져올 수 있습니까? 나는 변화가 없을 때 런타임에 확인하는 것이 불필요 해 보이기 때문에 묻는다. 나는이 효과에 뭔가 생각 해요 :Objective-C 객체 속성의 내부 검사

MyObject *foo = [[MyObject alloc] init]; 
NSDictionary *propertiesNamesAndValues = [foo getAllProperties]; 

현재 내 솔루션은 다음과 같습니다

id currentClass = [MyObject class]; 
NSString *propertyName; 
unsigned int outCount, i; 
objc_property_t *properties = class_copyPropertyList(currentClass, &outCount); 
for (i = 0; i < outCount; i++) 
{ 
    objc_property_t property = properties[i]; 
    propertyName = [NSString stringWithCString:property_getName(property)]; 
    NSLog(propertyName); 
    NSLog(@"%@",[foo valueForKey:propertyName]); 
} 
+2

기본적으로'getAllProperties'라는 코드 주위에 래퍼가 필요합니까? NSObject의 카테고리에 코드를 추가하는 것만 큼 좋을까요? – mattjgalloway

+2

'NSDictionary * propertiesNamesAndValues ​​= [foo getAllProperties]; '는 현재 솔루션과 마찬가지로 런타임에 실행됩니다. @mattjgalloway와 마찬가지로, 메소드에 해당 기능을 캡슐화 할 수 있는지 묻는 것처럼 보입니다. 대답은 '예'입니다. – Chuck

답변

5

간단한 대답은 없습니다.

정의에 의한 내성 검사는 런타임에 발생합니다. 또한 objective-c는 사실상 모든 것을 런타임까지 연기하는 매우 동적 인 언어입니다.

Objective-C에서, 당신은 단지 내성을위한 문법적 설탕을 가지고 있지 않다. 단지 plain-C 런타임 기능 만 갖고있다.

그러나 더 많은 Objective-C'ish API를 제공하기 위해 NSObject에 일부 카테고리를 작성하는 것을 방해하는 것은 없으며 이미 인터넷을 통해 일부 오픈 소스 구현이 있어야합니다.