KVC 기본 원리

2448 단어
KVC란?키 값을 통해 대상의 속성을 가져오는 것이지, 명확한 접근 방법을 통해 가져오는 것이 아닙니다.

1. KVC의 get 방법

[myObject valueForKey:@"name"]; 방법으로 myObjectname 속성이나 구성원 변수의 값을 얻는다.myObject 객체에 name 속성이나 구성원 변수가 없으면 시스템이 충돌합니다.이 문제를 어떻게 해결할 것인가.1. 리메이크valueForUndefinedKey 방법을 통해 붕괴 문제를 해결한다.
- (id)valueForUndefinedKey:(NSString *)key{
    return nil;
}

2. getName,name 또는 isName 중 하나를 다시 쓰는 방법으로 충돌 문제를 해결합니다.KVC 밑바닥 작업, valueForKey: 우선 우리가 주동적으로 속성을 만들었는지 판단하고 없으면 get, is 세 가지 방법(문자 찾기 방식)을 찾습니다.만약 찾지 못한다면, 계속해서 다른 유형의 검색 방식에 따라 찾으세요.액세스:accessInstanceVariablesDirectly 메서드, YES인 경우key、_isKey, key, isKey의 순서대로 구성원 변수에 접근합니다.
- (NSString *)name{
    NSLog(@"%s",__func__);
    return @"name";
}
- (NSString *)isName{
    NSLog(@"%s",__func__);
    return @"isName";
}
- (NSString *)getName{
    NSLog(@"%s",__func__);
    return @"getName";
}

3. 상기 방법이 없으면 KVC는 프로토콜에 따라 다른 종류(문자열, 그룹, 사전 등)의 API를 두루 훑어본다.배열 유형: countOf, objectInAtIndex
- (NSInteger)countOfName{
    return 2;
}
- (id)objectInNameAtIndex:(NSInteger)index{
    return @"name";
}

name 값 NSLog(@"%@",[myObject valueForKey:@"name"]); 을 출력할 때: name name

2. KVC의 set 방법


myObject에name 속성이나 구성원 변수가 없으면 KVC의 set 방법을 실행할 때 프로그램을 실행할 때 충돌이 발생합니다.[myObject setValue:@"KVC" forKey:@"name"]; KVC의 set 메소드 속성 이름 실행 순서key、_isKey、key、isKey.
@interface MyObject ()
{
    NSString * _name;
    NSString * name;
    NSString * isName;
}

3. KVC가 개인 변수를 수정하는 것을 어떻게 막는가

+ (BOOL)accessInstanceVariablesDirectly{
    return NO;
}

이 API가 NO로 되돌아오면 키 검색을 중지하면 외부에서 KVC를 통해 개인 변수를 수정하는 것을 막을 수 있습니다.KVC의 set 메서드에서 클래스에 이(가) 없는 경우name 속성, 시스템이키, 키, isKey 순서로 키를 할당합니다.KVC의 get 방법으로는 이 API를 막을 수 없습니다.KVC 속성 획득은 키에 대한 것입니다. 규칙에 따라 일련의 검색을 합니다. 먼저 검색 방법을 찾고 해당하는 방법을 찾지 못하면accessInstanceVariablesDirectly가 YES로 되돌아오는지 확인하고 YES로 돌아가 계속 검색한 다음에 변수를 검색하고 NO로 돌아가면 검색을 중지합니다.총괄적으로 말하면: 1. 먼저 검색하는 방법->accessInstanceVariablesDirectly(YES)->변수를 다시 검색한다.2. 먼저 검색하는 방법->accessInstanceVariablesDirectly(NO)->끝;

4. 응용 장면


사유 방법을 고치다.예: [self.tf setValue:[UIColor redColor] forKeyPath:@"placeholderLabel.textColor"];

좋은 웹페이지 즐겨찾기