2016-12-15 4 views
2

이 속성에 사용자 정의 getter, setter 및 ivar가 정의되어있는 경우 속성 값에 액세스하기 위해 Key-Value 코딩이 Objective-C에서 작동하는 방식이 궁금합니다. Accessor Search Patterns에 따르면 런타임은 먼저 getter 메서드를 검색하고 리플렉션 문자열을 사용하여 ivar를 찾는 것으로 돌아갑니다.사용자 정의 getter, setter 및 ivar로 키 값 코딩

검색 패턴에 따르면 getter도 ivar도 발견되지 않으면 예외가 throw되어야합니다.

그러나, 나는 다음과 같은 코드를 실행하면 속성에 직접 액세스하여 설정 값 : 나는 두 개의 서로 다른 값을 얻을

Set value to 9 with direct access 
Direct access: 9 
Set value to 20 with KVC 
Direct access: 9 
ValueForKey access: 20 

것 같다 :

#import <Foundation/Foundation.h> 

@interface Class1 : NSObject { 
    NSInteger prop; 
} 

@property (getter=customGetter,setter=customSetter:) NSInteger prop; 

@end 

@implementation Class1 
@synthesize prop = customIvar; 

@end 

int main() { 
    Class1 *class1; 

    // Create and give the properties some values with KVC... 
    class1 = [[Class1 alloc] init]; 

    class1.prop = 9; 
    NSLog(@"Set value to 9 with direct access"); 

    // Directly access value, should return 9. 
    NSLog(@"Direct access: %ld", class1.prop); 

    // Set with setValue:forKey: to 20. 
    NSLog(@"Set value to 20 with KVC"); 

    [class1 setValue:[NSNumber numberWithInt:20] forKey:@"prop"]; 

    // Directly access value. 
    NSLog(@"Direct access: %ld", class1.prop); 

    // Access value using KVC 
    NSNumber *propVal = [class1 valueForKey:@"prop"]; 

    NSLog(@"ValueForKey access: %d", [propVal intValue]); 
} 

을 나는이 출력을 얻을 (9)에서 직접 읽을 때 검색됩니다. 키 - 값 코딩을 사용하여 설정된 값은 키 - 값 코딩 (20)을 사용하여 검색됩니다.

누군가가 내부적으로 어떻게 작동하는지 알고 있습니까? 이 동작이 예상되고 뭔가 빠졌습니까? 당신이 당신의 속성을 변경하고 당신이 무슨 일이 일어나고 있는지 볼 수 후

- (void) showVars 
{ 
    NSLog(@"->prop %ld | ->customIVar %ld", prop1, customIvar); 
} 

을하고 전화 :

답변

0

Class1에 다음 메서드를 추가합니다.

getter 및 setter 검색에 대한 링크는 무엇입니까?

답변을 찾았습니다.

잘 설명되어 있습니까?

+0

감사합니다 당신의 대답. 나는 바르의 값이 속성의 값과 다른 것을 볼 HTH :-(아마, 오브젝티브 C & 코코아는 형식적인 의미 론적 설명이 없습니다. 내가 읽은 참조를 완전히 이해하지 못했지만 의미가 표시되지 않습니다. – DennisFrett

+0

KVC 검색 알고리즘에 대한 설명은 검색하는 메소드와 var 이름을 정확하게 지정하고 사용자 정의 getter, settor 또는 var를 포함하지 않습니다. 이름은 ... – CRD