Key-value coding

  • 변수 이름으로 변수의 값을 선정하거나 가져오는 방식 (key-value mapping)

  • 변수 이름: key, string
    문자열을 이용해 property에 접근
    - 접근자(Accessor Methods) 통하지 않고 property 이름인 문자열로 접근하므로, 객체간 의존성을 낮추고 결합도가 낮은 소프트웨어 개발을 있음.

  • 관련 함수는 NSKeyValueCoding 프로토콜에 의해 정의됨.
    NSObject가 이 protocol을 confirm하므로 모든 자료형 가능

    - setValue:forKey:

    - valueForKey:

 

// set value
Student *s = [[Student alloc] init];
[s setValue:@“Larry” forKey:@“firstName”];

// get value
NSString *x = [s valueForKey:@“firstName”];

 

 

Key paths

  • 객체들을 특정 경로로 정렬.

  • 이름을 가져오는데 키 경로(Key Path)를 이용
    NSString *mn = [selectedPerson valueForKeyPath:@“spouse.scotter.modelName”];

  • 키 경로 연산자: @avg, @count, @max, @min, @sum
    NSNumber *theAvg = [employees valueForKeyPath:@“@avg.expctedRaise”];

 

Key-value Observing

  • 객체의 property 변경되는 것을 알고 싶을  사용하는 기능.
    (keypath 통해 property 변경을 감지하고 알려줌)

- (void)addObserver:(NSObject *)anObserver

               forKeyPath:(NSString *)keyPath

                    options:(NSKeyValueObservingOptions)options

                   context:(void *)context

      • keyPath 지정된 property 감시할 것을 등록.
      • Observer 객체는 anObserver, 
      • options property 변경될  보내지는 notification message이며, 
        종류는 NSKeyValueObservingOptionNew, NSKeyValueObservingOptionOld, OR 연산으로 두가지 같이   있음.

- (void)observeValueForKeyPath:(NSString *)keyPath

                                      ofObject:(id)object

                                        change:(NSDictionary *)change

                                        context:(void *)context

// NSObject에 정의  -> fido의 값이 변경되면 나에게 메시지를 줘!
[theAppDelegate addObserver:self
                 forKeyPath:@“fido”
                    options:NSKeyValueChangeOldKey
                     context:somePointer];

/* keypath : @“fido”
object: AppDelegate
context: observer로 등록할 때 인수로 사용한 context 주소 공간을 가리키는 포인터
change: fido 이전값, 새로운 값 
*/
- (void)observeValueForKeyPath:(NSString *)keyPath
				   	  ofObject:(id)object
					    change:(NSDictionary *)change
					   context:(void *)context {
                       //...
}

+ Recent posts