2011-12-11 1 views
4

Objective-C는 런타임 리플렉션 기능을 제공합니다. 선언 된 속성의 getter/setter selector 이름을 찾으려고합니다. 나는 field/setField:과 같은 기본적인 규칙을 안다. 어쨌든 런타임 리플렉션은 완전한 추상화를 위해 이름을 해결하는 기능을 제공해야한다고 생각하지만 기능을 찾을 수 없습니다.Objective-C에서 런타임 리플렉션을 사용하여 속성 getter/setter 메서드 선택기를 해결하는 방법은 무엇입니까? (역방향)

나는 게터/setter 메소드를 목표 - C의 런타임 반사 (실제로 애플의 코코아)

또는 쿼리를 역으로 선언 된 재산의 선택 (안 구현을) 해결할 수있는 방법. (방법 선택 → 선언 속성)

답변

8

난 당신이 속성을 명시 적으로 선언 된 경우에만 선택 이름을 얻을 수 있다고 생각합니다 (XXX 세터 = 및/또는 게터 = XXX) 그래서

는 getter와 setter 셀렉터를 얻을 수 클래스 '고양이'가있는 특성 'furType'의 이름 :

objc_property_t prop = class_getProperty([Cat class], "furType"); 

char *setterName = property_copyAttributeValue(prop, "S"); 
if (setterName == NULL) { /*Assume standard setter*/ } 

char *getterName = property_copyAttributeValue(prop, "G"); 
if (getterName == NULL) { /*Assume standard getter */ } 

나는 역 쿼리 모르겠어요, 모든 속성을 반복하고 일치를 찾고 이외. 희망이 도움이됩니다.

+1

이러한 메소드는''에 선언되어 있습니다. –

0

내 NSObject 카테고리에서 약간의 업데이트.

+(SEL)getterForPropertyWithName:(NSString*)name { 
    const char* propertyName = [name cStringUsingEncoding:NSASCIIStringEncoding]; 
    objc_property_t prop = class_getProperty(self, propertyName); 

    const char *selectorName = property_copyAttributeValue(prop, "G"); 
    if (selectorName == NULL) { 
     selectorName = [name cStringUsingEncoding:NSASCIIStringEncoding]; 
    } 
    NSString* selectorString = [NSString stringWithCString:selectorName encoding:NSASCIIStringEncoding]; 
    return NSSelectorFromString(selectorString); 
} 

+(SEL)setterForPropertyWithName:(NSString*)name { 
    const char* propertyName = [name cStringUsingEncoding:NSASCIIStringEncoding]; 
    objc_property_t prop = class_getProperty(self, propertyName); 

    char *selectorName = property_copyAttributeValue(prop, "S"); 
    NSString* selectorString; 
    if (selectorName == NULL) { 
     char firstChar = (char)toupper(propertyName[0]); 
     NSString* capitalLetter = [NSString stringWithFormat:@"%c", firstChar]; 
     NSString* reminder  = [NSString stringWithCString: propertyName+1 
                encoding: NSASCIIStringEncoding]; 
     selectorString = [@[@"set", capitalLetter, reminder, @":"] componentsJoinedByString:@""]; 
    } else { 
     selectorString = [NSString stringWithCString:selectorName encoding:NSASCIIStringEncoding]; 
    } 

    return NSSelectorFromString(selectorString); 
}