KVC 액세서리 구현 상세 정보

3347 단어

전언


이 문서는 Accessor Search Implementation Details 및 애플 설명서의 메모에서 번역되었습니다.잘못 번역하신 점 많은 양해와 시정 부탁드립니다, 감사합니다~

번역 배경


핫 픽스 과정에서 JSPatch의 OC setter 방법이 자바스크립트 코드로 전의되는 것을 보고 묘함을 느꼈다.코드는 다음과 같습니다.
@interface WMPatchTest
@property (nonatomic, strong) NSString *name;
@end

@implementation WMPatchTest
- (void)setName:(NSString *)name {
    _name = name;
}
@end
defineClass('WMPatchTest', {
    setPayCompletion: function(name) {
        self.setValue_forKey(name, "_name");
    },
});

코드에서 setKey:value: 함수를 사용할 때 _name 를 사용하고 보호된 속성 _name 에 직접 값을 부여합니다.@property로 속성 설명을 하고 Getter와setter 방법이 수동으로 동시에 실현되지 않은 경우 시스템은 자동으로 보호된 속성을 생성합니다. 속성 이름은property 앞에 밑줄을 긋는 것입니다property.
Then, KVC에 대해 더 자세히 알고 싶으면 아래에 번역된 애플 문서를 보십시오~

KVC 액세서리 구현 상세 정보


KVC에서 실례 변수에 직접 접근하기 전에 속성의 접근 방법을 사용하려고 시도합니다.이 글은 KVC가 어떤 방법으로 속성에 접근할지 어떻게 결정하는지 설명한다.

단순 속성의 경우 -setValue:forKey:

-setValue:forKey: 방법이 하나의 속성에 대한 기본값을 호출한 후에 실행하는 순서는 다음과 같다.
  • 우선 호출 클래스의 실례 방법을 검색하고 실례 방법의 이름 모델은 set(즉 set 문자열과 키 값의 조합)이다.메서드를 찾으면 메서드 매개변수도 검증됩니다.매개 변수 형식이 대상 포인터 (id) 가 아니지만, 매개 변수 값이nil이면 -setNilValueForKey: 호출됩니다.-setNilValueForKey: 기본 구현은 NSInvalidArgumentException 이상을 던지지만, 이 방법의 구현을 다시 쓸 수 있습니다.매개변수 유형이 객체 포인터인 경우 메서드는 간단하게 통과를 검증합니다.만약 매개 변수 유형이 다른 유형(예를 들어 int, CGPoint 등)이라면 방법-valueForKey:이 호출되기 전에 자동으로 이 유형들을 NSNumber나 NSValue로 변환할 것이다.
  • 방법을 찾지 못했고 이 방법을 호출한 클래스 방법+accessInstanceVariablesDirectly이 YES로 되돌아오면 이 클래스의 실례적인 변수 이름을 찾아 순서대로 스타일에 일치시킵니다. _, _is, , is.일치하는 변수를 찾았고 변수가 대상형이라면 대상 인용 계수가 1이 증가하고 변수도 부여되며, 그 다음에 원래 변수가 가리키는 구치 인용 계수는 1이 감소합니다.실례 변수가 다른 유형(예를 들어 int, CGPoint 등)이라면 1단계와 같이 NSNumber나 NSValue를 비대상 유형으로 바꾸고 값을 부여한다.
  • 그렇지 않으면 (방법과 실례 변수를 찾지 못했다) -setValue:forUndefinedKey: 방법을 호출할 것이다.이 방법은 기본적으로 NSUndefinedKeyException 이상을 던지지만, 다시 쓸 수 있습니다.

  • 호환성 참고 사항:

  • -takeValue:forKey: 방법의 하위 2진법 호환에 대해 단계 1에서 방법명 모델-_set:도 식별된다.그런데 Mac 10.3 시스템 이후 KVC에서 밑줄로 시작하는 모드 방법은 폐기되었습니다.
  • 후진법 호환성에 대해 호출 클래스 파라미터가 대상형이 아니라면 단계 1-unableToSetNilForKey: 방법이 -setNilValueForKey: 호출을 대체한다.
  • 단계2에서 기술한 행위는-takeValue:forKey:와 달리 후자는 클래스 실례 변수를 검색할 때 순서대로 일치하기만 한다, _모드.
  • 단계 3에서 -takeValue:forKey: 방법에 대해 호출 클래스 파라미터가 대상형이 아니라면 -handleTakeValue:forUnboundKey:-setValue:forUndefinedKey:의 호출을 대체한다.

  • 밤 분석


    다시 배경을 돌이켜 보면 name는 WMPatchTest 클래스 속성이고 컴파일러는 setter 방법-setName:, Getter 방법-name, 그리고 사유 변수_name를 자동으로 생성한다.[WMPatchTest setValue:@"xx"forKey:@"name"]를 실행할 때 먼저 1단계를 수행하여 이름set_name 방법을 찾습니다.발견된 후 2단계를 진행하여 검사+accessInstanceVariablesDirectly가 YES인 후(기본값은 YES) 클래스 변수가 이 스타일에 일치하도록 한다. _name, _isName, name, isName,_name 일치하고 값 부여 작업을 수행한다.

    뒷말


    개발 과정에서 KVC의 설정 방법의 사용이 빈번하고 내부 세부 사항을 깊이 이해하면 우리가 더 많은 사고방식을 제공할 수 있고 이상 상황에 부딪혔을 때 사고방식이 더욱 뚜렷하다.

    좋은 웹페이지 즐겨찾기