IOS KVC(키 값 인코딩) 모드
5331 단어 KVC
IOS에는 방법과 변수를 포함한 절대적인 사유가 없다.개인 방법은 클래스 실례를 통해 직접 접근할 수 없지만, '컴파일할 때 실행' 메커니즘이 있기 때문에, 우리는perfromSelectoe와 비슷한 방법으로 개인 방법에 접근할 수 있다.IOS의 사유 변수는 이른바 KVC 모드를 통해서도 접근할 수 있다.다음은 멋있죠?
KVC 모드는 키-value coding(키 값 인코딩)으로 문자열 표식을 사용하여 대상 속성에 간접적으로 접근하는 원리입니다.중요한 방법은 NSKeyValueCodingprotocol에서 정의합니다.KVC는 클래스 객체 및 기본 데이터 유형을 지원합니다.우리는 주로 두 쌍의 방법을 사용한다.
1,setValue:forKey,valueForKey;NSString 속성의 이름을 입력합니다.
2, setValue: forKeyPath,valueForKeyPath(NSString 속성으로 전송되는 경로, xx.xx 형식)
주의 사항:
KVC를 통해 대상을 호출할 때, 예를 들어: [self valueForKey: @ "tekuba"];
프로그램은 자동으로 몇 가지 다른 방식으로 이 호출을 해석하려고 시도할 것이다.우선 대상이tekuba를 가지고 있는지 확인하고 getTekuba,tekuba 및Tekuba 몇 가지 형식입니다. 만약 찾지 못하면, 대상이tekuba라는 실례 변수 (iVar) 를 가지고 있는지 계속 찾습니다. 찾지 못하면, 프로그램은 - (id) valueForUndefinedKey: 이 방법을 계속 호출하려고 합니다.만약 이 방법이 실현되지 않는다면, 프로그램은 NSUndefinedKeyException 이상 오류를 던질 것입니다. (확인 대기 중)
디자인valueForUndefinedKey: 방법의 주요 목적은 - (id)valueForKey 방법을 사용하여 대상에서 값을 요청할 때 대상이 오류가 발생하기 전에 이 요청에 응답할 수 있는 마지막 기회가 있다는 것입니다.
다음 예제를 참조하십시오.
헤더 파일 TekubaNet.h
#import<Foundation/Foundation.h>
@interface TekubaNet:NSObject
{
NSString *url;
}
@end
구현 파일#import"TekubaNet.h"
@implementation TekubaNet
@end
이 TekubaNet 클래스는 url 변수가 하나밖에 없어요.이런 경우 TekubaNet의 클래스 실례를 통해 URL에 접근할 수 없습니다.다음은 KVC 모드로 URL에 접근합니다.다음과 같습니다.
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
TekubaNet *tekubaNet=[[TekubaNet alloc] init];
[tekubaNet setValue:@"http://www.tekuba.net" forKey:@"url"];
NSString *url=[book valueForKey:@"url"];
NSLog(@"tekuba url= %@",url);
[pool release];
return 0;
}
코드에 대한 보완 사항은 다음과 같습니다.Webmaster 클래스, 멋있는 블로거를 정의합니다.
헤더 파일 Webmaster.h
#import<Foundation/Foundation.h>
@interface Webmaster:NSObject
{
NSString *name;
}
@end
구현 파일#import"Webmaster.h"
@implementation Webmaster
@end
TekubaNet 클래스에 Webmaster를 추가합니다.#import<Foundation/Foundation.h>
@interface TekubaNet:NSObject
{
Webmaster *webmaster;
NSString *url;
}
@end
TekubaNet의 구현 파일은 변경되지 않습니다.KVC 모드를 사용하여 TekubaNet의 웹 마스터의name 속성에 접근하는 것을 보여 줍니다.
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
TekubaNet *tekubaNet=[[[TekubaNet alloc] init] autorelease];
[tekubaNet setValue:@"http://www.tekuba.net" forKey:@"url"];
NSString *url=[tekubaNet valueForKey:@"url"];
NSLog(@"tekuba url: %@",url);
Webmaster *webmaster=[[[Webmaster alloc] init] autorelease];
[webmaster setValue:@" " forKey:@"name"];
[tekubaNet setValue:webmaster forKey:@"webmaster"];
NSString *name=[tekubaNet valueForKeyPath:@"webmaster.name"]; /* IOS path*/
NSLog(@"webmaster name: %@",name);
[pool release];
return 0;
}
또한 주의해야 할 것은 KVC의 또 다른 중요한 특징은 바로 자동 포장 해체 기능이다. 즉, KVC는 문자열에 따라 자동으로 적당한 데이터 형식으로 전환된다. 예를 들어 다음과 같다.@interface TekubaNet:NSObject
{
Webmaster *webmaster;
NSString *url;
int runDay;
}
또한 다음과 같은 방법으로 액세스할 수 있습니다.[tekubaNet setValue:@"365" forKey:@"runDay"];
NSLog(@"tekubaNet runTime is %@",[tekubaNet valueForKey:@"runDay"]);
런데이는 int형이지만%@로 출력할 수 있습니다.(1) setValue:forKey 검색 방법:
set
위의 setter 방법을 찾지 못했습니다. 만약 클래스 방법accessInstanceVariablesDirectly가 YES로 되돌아온다면 (주: 이것은 NSKeyValueCodingCatogery에서 이루어진 클래스 방법입니다. 기본적으로 YES로 되돌아옵니다.)그러면 <을 누릅니다.key>,_is
설정 구성원의 값을 찾으면 setValue:forUndefinedKey:가 호출되지 않습니다.
(2)valueForKey:에 대한 검색 방법:
1. 먼저 Get
2. 위의 Getter를 찾지 못했습니다.countOf
countOf
3. 아직 찾지 못했습니다.count Of
이 세 가지 방법을 모두 찾으면 NSSet의 모든 방법에 응답할 수 있는 프록시 집합 (collection proxy object) 을 되돌려줍니다.이 프록시 집합(collection proxy object)에 보내는 NSSet 메시지 방법은count Of
4. 아직 찾지 못했습니다. 만약 클래스 방법accessInstanceVariablesDirectly가 YES로 되돌아온다면
5. 더 이상 찾을 수 없음.valueForUndefinedKey:를 호출합니다.
본문 주소: www.tekuba.net/program/294/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
iOS 키 값 인코딩(KVC) 및 키 값 감지(KVO)KVC setter와 Getter 방법으로 대상의 속성을 설정하고 수정하며 간략한 점문법을 제외하고는oc는 더욱 유연한 조작 방식을 제공했다. 이런 방식은 문자열 형식으로 간접 조작 대상의 속성을 허용하는데 전체 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.