이 속성에 사용자 정의 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);
}
을하고 전화 :
감사합니다 당신의 대답. 나는 바르의 값이 속성의 값과 다른 것을 볼 HTH :-(아마, 오브젝티브 C & 코코아는 형식적인 의미 론적 설명이 없습니다. 내가 읽은 참조를 완전히 이해하지 못했지만 의미가 표시되지 않습니다. – DennisFrett
KVC 검색 알고리즘에 대한 설명은 검색하는 메소드와 var 이름을 정확하게 지정하고 사용자 정의 getter, settor 또는 var를 포함하지 않습니다. 이름은 ... – CRD