2013-08-12 2 views
3

@dynamic 키워드 (NSManagedObject와 유사)를 사용하여 선언 된 속성을 지원하는 사전을 동적으로 구현하고 있습니다.런타임에 속성이 @dynamic으로 선언되었는지 확인하는 방법

런타임시 특정 선택기가 @dynamic으로 선언되었는지 여부를 알 수 있습니까? 이건 그냥 컴파일러가 디자인 타임 툴링에 대한 속임수이고 런타임에 잃어 버렸을까요? 아니면 이것을 조사 할 여유가 있습니까? 또한

+ (BOOL) resolveInstanceMethod:(SEL)sel 
{ 
    NSString *method = NSStringFromSelector(sel); 
    // ideally I could also check here if the selector is @dynamic 
    if ([method hasPrefix:@"set"] && [method rangeOfString:@":"].location == method.length -1) { 
     class_addMethod([self class], sel, (IMP) dynamicSet, "[email protected]:@"); 
     return YES; 
    } 
    else if ([method hasPrefix:@"get"] && [method rangeOfString:@":"].location == method.length -1) { 
     class_addMethod([self class], sel, (IMP) dynamicGet, "[email protected]:@"); 
     return YES; 
    } 

    BOOL value = [super resolveInstanceMethod:sel]; 
    return value; 
} 

, [슈퍼 resolveInstanceMethod : SEL]를 내 클래스의 서브 클래스는 NSDictionary하지만 기존의 방법에 대해 호출됩니다 - 아직도 false를 반환?

답변

3

속성의 이름을 알고있는 경우 다음 함수에서와 같이 동적 속성인지 여부를 조사하기 위해 런타임 함수를 사용할 수 있습니다. <objc/runtime.h>을 가져 오십시오.

BOOL isClassPropertyDynamic(Class theClass, NSString *propertyName) 
{ 
    BOOL isDynamic = NO; 
    objc_property_t property = class_getProperty(theClass, [propertyName UTF8String]); 
    char *dynamicAttributeValue = property_copyAttributeValue(property, "D"); 
    if (dynamicAttributeValue != NULL) { 
     isDynamic = YES; 
     free(dynamicAttributeValue); 
    } 
    return isDynamic; 
} 

그러나, 항상 getter 및 setter 이름을 모두가 선언시 사용자 정의 할 수 있으며,이 건물에 선택 이름에서 이동하기 쉽지 않을거야. 일반적으로 부울 속성의 getter에 대해서만 수행되지만 기술적으로 누구나 해당 규칙을 위반할 수 있습니다.

일반적으로 셀렉터가 대문자로 시작하여 끝에 ":"가 포함 된 경우 속성 이름은 "set"및 ":"을 제거하고 첫 번째 항목을 만드는 결과 문자열이됩니다 편지 소문자. 선택자가 "is"로 시작하여 대문자가오고 인수가없는 경우 "is"를 제거하고 첫 번째 문자를 소문자로 만드는 결과 문자열이됩니다. 인수가없고 "is"로 시작하지 않고 대문자로 된 선택자는 일반적으로 등록 정보 이름과 선택자 이름이 동일합니다.

다시 말하면, 이는 단지 대회이며 누군가 어딘가에서 깨질 것입니다. 선택기가 동적 속성에 해당하는지 여부를 판단하는 것이 정말로 가치가 있는지 결정해야합니다 (예 : borrrden과 관련하여 의심 스럽지만 요구 사항에 익숙하지 않습니다.).

또한 "모든 속성 (class_copyPropertyList 사용)을 반복하고 각 G 및 S (속성)을 검사하여 선택기와 속성 간의 매핑을 빌드하는"주석에서 rob mayoff의 훌륭한 제안을 따를 수 있습니다.

+1

'G'와'S' 속성 속성은 커스텀 getter와 setter 이름이 정의되어 있다면 그것을 포함합니다. * Objective-C 런타임 프로그래밍 가이드 *의 [선언 된 속성] (http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtPropertyIntrospection.html#//apple_ref/)을 참조하십시오. doc/uid/TP40008048-CH101-SW1). –

+0

@robmayoff 사실,하지만 그 값을 얻을 수 있다면 이미 속성 이름을 가지고 있습니다. 질문은 선택자에서 덜 명확한 속성으로 이동하는 방법을 묻는 것입니다. –

+1

'class_copyPropertyList '를 사용하여 모든 속성을 반복하고 각각의'G'와'S'를 검사 할 수 있습니다. 하지만 init의 모든 속성을 반복하고 각 동적 속성에 접근자를 추가하는 것이 좋습니다. –

관련 문제