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 {
//...
}
'iOS > iOS 기본기' 카테고리의 다른 글
[iOS] NSCopying protocol (0) | 2019.11.25 |
---|---|
[iOS] Archive - NSCoding protocol, Serialization(직렬화), NSUserDefaults (0) | 2019.11.24 |
[iOS] Helper object / Delegate 동작 방식 / Protocol (0) | 2019.11.24 |
[iOS] AppKit Framework - UIControl, target-action (0) | 2019.11.24 |
[iOS] nil, Nil, NULL, NSNull / Swift와 Objective-C에서의 nil 차이점 (0) | 2019.11.24 |