KVC와 KVO 원리 해석

3115 단어

KVC 키 값 인코딩(Key-value coding)


KVC는 우리가 문자열로 대상을 조작하는 데 편리한 메커니즘으로 대상을 조작할 때 사전과 같이 유연하게 할 수 있다.사전 전환 모델의 영역에서 응용하기에 매우 편리하고 KVC는 접근 제한의 일부 문제를 쉽게 돌파하여 개인 구성원에게 직접 접근할 수 있다
  • 주요 방법
  • - (id)valueForKey:(NSString *)key;  
    - (void)setValue:(id)value forKey:(NSString *)key; 
    // “ ” , Path  
    - (id)valueForKeyPath:(NSString *)keyPath;  
    - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
    
  • KVC의 장점(1).클래스의 구성원이 개인이든 아니든 KVC를 사용하면 정상적인 값과 값을 얻을 수 있습니다. 예를 들어 속성이 확장에서 점문법으로 값을 부여할 수 없으면 kvc로 값을 부여할 수 있습니다. (2)구성원 변수에 밑줄을 넣든지 말든지, KVC로 값을 얻거나 부여할 때 들어오는 속성 이름은 밑줄을 넣지 않아도 됩니다 (3).사전 모형 코드를 크게 간소화하고 KVC는 더욱 간결한 조작 방식을 제공합니다. 사전을 전송하기만 하면 사전의 모든 값을 실체류에 대응하는 속성
  • 에 자동으로 부여할 수 있습니다.
    NSDictionary *dic = @{
                              @"name":@"test",
    //KVC , , 
                              @"age":@18,
                              @"address":@"China"
                              };
        [p setValuesForKeysWithDictionary:dic];
        NSLog(@"name:%@ age:%ld address:%@",p.name,p.age,p.address);
    
  • KVC의 단점: 1.인코딩할 때 키를 잘못 입력해서 문제를 해결하는 방법입니다. KVC를 사용할 때 전송되는 키는 클래스에 같은 이름의 속성이 존재하는 것을 보증해야 합니다.그렇지 않으면 실행할 때 붕괴됩니다.실행할 때 충돌을 원하지 않으면, 클래스에서 setValue: 값 for UndefinedKey: 키 방법을 다시 써야 합니다. 그러면, KVC로 Person 대상에게 키와 속성에 대응하지 않는 오류를 부여하면 시스템이 자동으로 이 방법을 호출합니다.2. 문법에 비해 문법도 약간 번거롭다.해결 방법:runtime로 대체
  • 실현 방법: KVC는 하나의isa-swizzling 기술을 운용하여 모든 대상에isa지침이 있다.KVC는 주로isa-swizzling을 통해 내부 검색 포지셔닝을 실현한다. (1) 실례적인 방법으로 호출할 때, 대상의isa를 통해 클래스에서 얻는 방법의 실현(2) 클래스 방법으로 호출할 때, 클래스의isa를 통해 클래스에서 얻는 방법의 실현
  • KVC의 부수 원리:
  • @implementation Person {
        NSString *_address;
    }
    
    Person *p  =[[Person alloc] init];
    [p setValue:@"China" forKey:@"address"];
    NSString *ads = [p valueForKey:@"address"];
    

    찾는 순서는 setAddress:==>address==>_isAddress==>address==>isAddress
  • KVC로 값을 부여할 때 set: 속성 값 방법(setAddress: (NSString*)address)을 우선적으로 호출합니다
  • 찾을 수 없으면 밑줄이 그어진 멤버 변수부터 찾습니다(address), 다시 찾기is(isAddress), 찾으면 지정
  • 위에서 찾을 수 없으면 밑줄이 없는 구성원 변수(address)를 먼저 찾고 is(isAddress)를 찾으며 값을 부여합니다
  • 위에 열거한 방법이나 구성원 변수가 존재하지 않으면 시스템은 이 대상의 setValue: forUndefinedKey: 방법, 기본적으로 이상 던지기 5.이 클래스가 KVC를 사용하지 못하게 하려면 + (BOOL)accessInstanceVariablesDirectly 방법을 다시 쓰면 NO로 되돌려줍니다. 그러면 KVC에서 set: 속성 이름을 찾지 못하면 setValue: forUndefinedKey: 방법을 사용합니다.

  • KVO 키 값 관찰 Key-value observing)

  • 원리를 실현하면 대상을 관찰할 때 새로운 클래스가 동적으로 만들어집니다.이 클래스는 대상의 원래 클래스를 계승하고 관찰된 속성의setter 방법을 다시 썼다.자연히 다시 쓰는 setter 방법은 원래의 setter 방법을 사용하기 전과 후에 모든 관찰 대상 값의 변경 사항을 알립니다.마지막으로 이 대상의 이사 포인터(isa 포인터는 런타임 시스템에 이 대상의 클래스가 무엇인지 알려준다)를 이 새로 만든 하위 클래스를 가리키면 대상은 신기하게도 새로 만든 하위 클래스의 실례가 된다.원래, 이 중간류는 원래의 그 종류에서 물려받았다.뿐만 아니라 애플은 -class 방법을 다시 써서 우리를 속이려 했지만 변하지 않았다. 바로 그 종류였다.

  • 간단하게 말하면 특정한 클래스의 속성에 관찰을 추가할 때 시스템은 이 클래스의 파생류를 만들고 파생류가 이 속성을 다시 쓰는 setter 방법으로 관찰 대상의 변화를 실현하고 이 대상의isa지침을 이 파생류를 가리킨다.대상이 새로 만든 하위 클래스의 실례가 됩니다.이것은 KVC를 바탕으로 이루어진 것으로 응답식 프로그래밍을 실현했고 내부적으로runtime의 특성을 운용했다.KVO를 수동으로 구현하는 방법http://tech.glowing.com/cn/implement-kvo/

    좋은 웹페이지 즐겨찾기