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 먼저 검색: 메서드.구성원이 @property를 사용하면 @synthsize에서 처리합니다. @synthsize는 컴파일러에게 set: 형식의 setter 방법을 알려 주기 때문에 이 경우 바로 검색됩니다.참고: 여기서 는 구성원 이름과 대문자를 나타냅니다.아래와 같다.
위의 setter 방법을 찾지 못했습니다. 만약 클래스 방법accessInstanceVariablesDirectly가 YES로 되돌아온다면 (주: 이것은 NSKeyValueCodingCatogery에서 이루어진 클래스 방법입니다. 기본적으로 YES로 되돌아옵니다.)그러면 <을 누릅니다.key>,_is, , is의 순서대로 구성원 이름을 검색합니다.
설정 구성원의 값을 찾으면 setValue:forUndefinedKey:가 호출되지 않습니다.
(2)valueForKey:에 대한 검색 방법:
1. 먼저 Get, , is의 순서대로 Getter 방법을 찾고 직접 호출하는 방법을 찾습니다.bool, int 등의 내장 값 유형인 경우 NSNumber 변환이 수행됩니다.
2. 위의 Getter를 찾지 못했습니다.countOf,objectInAtIndex:,AtIndexes 형식의 방법을 찾습니다.
countOf와 다른 두 방법 중 하나를 찾으면 NSArray의 모든 방법에 응답할 수 있는 프록시 집합 (collection proxy object) 을 되돌려줍니다.이 프록시 집합(collection proxy object)에 보내는 NSArray 메시지 방법은count Of ,object InAtIndex:,AtIndexes 등 몇 가지 방법을 조합하여 호출됩니다.get:range: 메소드가 하나 더 있습니다.
3. 아직 찾지 못했습니다.count Of,enumerator Of,member Of: 형식을 찾는 방법입니다.
이 세 가지 방법을 모두 찾으면 NSSet의 모든 방법에 응답할 수 있는 프록시 집합 (collection proxy object) 을 되돌려줍니다.이 프록시 집합(collection proxy object)에 보내는 NSSet 메시지 방법은count Of,enumerator Of,member Of: 조합된 형식으로 호출됩니다.
4. 아직 찾지 못했습니다. 만약 클래스 방법accessInstanceVariablesDirectly가 YES로 되돌아온다면 ,_is,,is의 순서로 구성원 이름을 직접 검색합니다.
5. 더 이상 찾을 수 없음.valueForUndefinedKey:를 호출합니다.
본문 주소: www.tekuba.net/program/294/

좋은 웹페이지 즐겨찾기