KVC 액세서리 구현 상세 정보
전언
이 문서는 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:
방법이 하나의 속성에 대한 기본값을 호출한 후에 실행하는 순서는 다음과 같다.
@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");
},
});
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에서 밑줄로 시작하는 모드 방법은 폐기되었습니다.-unableToSetNilForKey:
방법이 -setNilValueForKey:
호출을 대체한다.-takeValue:forKey:
와 달리 후자는 클래스 실례 변수를 검색할 때 순서대로 일치하기만 한다, _
모드.-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의 설정 방법의 사용이 빈번하고 내부 세부 사항을 깊이 이해하면 우리가 더 많은 사고방식을 제공할 수 있고 이상 상황에 부딪혔을 때 사고방식이 더욱 뚜렷하다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.