Objective-C(17, KVC 키 값 인코딩 및 실례 설명) - iOS 개발 기초

이전의 학습 노트와 을 결합하여 Objective-C 지식점을 정리하고 정리했다.지식은 계속 변하고 있지만 참고로 애플 공식 문서를 기준으로 한다~
17. 키 값 인코딩 KVC
KVC에 대한 자세한 내용은 다음 예제에서 설명합니다.
Person.h 파일, Person 클래스에 name과age 두 개의 구성원 변수가 있음
 @interface Person : NSObject {
     @private
     NSString *_name;
     NSInteger _age;
 }
 - (void)setAge:(NSInteger)age;
 @end

Person.이 방법을 실현하다
 @implementation Person

 - (NSString *)description {
     return [NSString stringWithFormat:@"name:%@,age=%li", _name, _age];
 }

 - (void)setAge:(NSInteger)age {
     _age = age;
 }

 @end

main.m
 Person *p = [[Person alloc] init];
 // p->_name = @"Zane";     

 //1.  KVC private      
 [p setValue:@"Zane" forKey:@"name"];

 //2.  KVC      
 NSString *name = [p valueForKey:@"_name"];
 NSLog(@"%@", name);

 [p setValue:@21 forKey:@"age"];
 NSLog(@"%@", p);

output:
2015-07-09 17:29:43.477 exercise_KVC[579:24344] Zane 2015-07-09 17:29:43.478 exercise_KVC[579:24344] name:Zane,age=21

1. 키 값 인코딩(key-value coding): 대상에 포함된 정보를 나타내는 문자열을 키 값으로 사용하여 이 정보를 간접적으로 접근하는 방식입니다.
기본적으로, 액세서리 방법, 성명 속성, 실례 변수만 존재하면, 그 이름을 문자열로 접근할 수 있다.(이 변수가 @private에서 개인적으로도 접근할 수 있습니다)
2. 속성 값을 설정합니다.
 - (void)setValue:(id)value forKey:(NSString *)key; //       
 [p setValue:@"Zane" forKey:@"name"];

a. 만약 여기name가 잘못 썼다면nama,nam1e 등으로 쓰면 컴파일러가 잘못 보고하지 않지만 충돌 b,value를 id 형식으로 실행할 수 있기 때문에 기본 데이터 형식이라면 포장해야 합니다
속성 값 가져오기
 - (id)valueForKey:(NSString *)key;
 NSString *name = [p valueForKey:@"_name"];

만약 사람이 개 한 마리를 가지고 있다면, @class의 방식으로 Person에 추가합니다.h에서 개에 dogName 속성이 있으면 경로 설정을 지정할 수 있습니다
[p setValue:@"wangwang" forKeyPath:@"dog._dogname"];
NSLog(@"%@",[p valueForKeyPath:@"dog._dogname"])
- (id)valueForKeyPath:(NSString *)keyPath; - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;

3. 단점(1) 대상을 향한 봉인성을 파괴한다.(2) 컴파일러는 설정된 키밸류에 대해 버그 검사를 하지 않습니다.(3) 문자열을 먼저 분석해야 하며 실행 효율이 set과 get 방법보다 낮다
4, 기타 설명 (1) KVC를 사용하여 속성을 설정하고 현재 클래스에서 해당하는 set 방법이 있는지 우선적으로 찾습니다. set 방법 설정이 있으면 없으면 속성 설정을 찾습니다. 호출하려면age만 쓸 수 있고 쓸 수 없습니다예컨대
[p setValue:@21 forKey:@"age"];
[p setValue:@21 forKey:@"_age"];

age의 set 방법 실현에 단점을 설정할 수 있습니다. 만약에age는 set 방법을 사용하지 않습니다
(2) 일대다의 관계는 일반적으로 NSArray로 포장한 다음에 setValue 방법을 통해value로 값을 부여한다.액세스할 때 경로로valueForKeyPath에 액세스
(3) 수치 계산은 상기 예에서 Person에 책 구성원 변수를 증가시킨다.그리고 Dog.h멤버 변수 보유dogage
 @interface Dog : NSObject
 {
     int _dogage;
 }
 - (instancetype)initWithAge:(int)age;   //   
 @end

main.m
 Dog* dog1 = [[Dog alloc] initWithAge:20];
 Dog* dog2 = [[Dog alloc] initWithAge:30];
 Dog* dog3 = [[Dog alloc] initWithAge:10];

 NSArray *array = [NSArray arrayWithObjects:dog1,dog2,dog3, nil];
 [p setValue:array forKey:@"dog"];       //     

 NSLog(@"%@",[p valueForKeyPath:@"dog.@count"]);         //dog  
 NSLog(@"%@",[p valueForKeyPath:@"dog.@sum._dogage"]);   //  dogage  
 NSLog(@"%@",[p valueForKeyPath:@"dog.@avg._dogage"]);   //   
 NSLog(@"%@",[p valueForKeyPath:@"dog.@min._dogage"]);   //   
 NSLog(@"%@",[p valueForKeyPath:@"dog.@max._dogage"]);   //   

output:
2015-07-09 17:29:43.479 exercise_KVC[579:24344] 3
2015-07-09 17:29:43.479 exercise_KVC[579:24344] 60
2015-07-09 17:29:43.480 exercise_KVC[579:24344] 20
2015-07-09 17:29:43.480 exercise_KVC[579:24344] 10
2015-07-09 17:29:43.480 exercise_KVC[579:24344] 30

좋은 웹페이지 즐겨찾기