Link
Notice
HIT해
KVC vs KVO 본문
728x90
KVO vs KVC
Key-Value Coding (KVC)와 Key-Value Observing (KVO)는 Objective-C와 Swift에서 객체의 프로퍼티에 동적으로 접근하거나 변경 사항을 관찰하는 메커니즘입니다.
Key-Value Coding (KVC)
- 개념: KVC는 객체의 프로퍼티를 문자열 키를 사용하여 간접적으로 접근하는 방법을 제공한다. 이를 통해 프로퍼티의 값을 설정하거나 조회할 수 있다.
- 사용 예: KVC를 사용하면 객체의 프로퍼티에 동적으로 접근하거나 설정할 수 있다. 예를 들어, setValue:forKey:와 valueForKey: 메서드를 사용하여 객체의 속성을 조작할 수 있다.
// Objective-C 예시
Person *person = [[Person alloc] init];
[person setValue:@"John" forKey:@"name"];
NSString *name = [person valueForKey:@"name"];
// Swift 예시
let person = Person()
person.setValue("John", forKey: "name")
let name = person.value(forKey: "name") as? String
- 제약 사항: KVC는 Objective-C 런타임에 의존하므로, KVC를 사용하는 프로퍼티는 @objc 어노테이션을 필요로 하며, 객체는 NSObject를 상속받아야 한다.
Key-Value Observing (KVO)
- 개념: KVO는 KVC를 기반으로 하여 객체의 프로퍼티에 대한 변경 사항을 관찰할 수 있는 방법을 제공한다. 특정 프로퍼티의 변경을 감지하고, 변경 시 적절한 대응을 할 수 있다.
- 사용 예: KVO를 사용하면 특정 프로퍼티의 변경을 감지하여 대응할 수 있다. 이를 위해 addObserver:forKeyPath:options:context: 메서드를 사용하여 관찰을 설정하고, observeValueForKeyPath:ofObject:change:context: 메서드를 통해 변경 사항을 처리할 수 있다.
// Objective-C 예시
[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"name"]) {
NSLog(@"Name changed to %@", change[NSKeyValueChangeNewKey]);
}
}
// Swift 예시
person.addObserver(self, forKeyPath: "name", options: [.new], context: nil)
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "name" {
print("Name changed to \(change?[.newKey] as? String ?? "")")
}
}
- 제약 사항: KVO를 사용하려면 관찰할 프로퍼티에 @objc dynamic을 추가하여 동적 디스패치를 지원해야 한다. 또한, KVO는 메모리 관리와 관련된 문제가 발생할 수 있으므로 적절한 해제를 위해 removeObserver:forKeyPath: 메서드를 호출하여 관찰을 제거해야 한다.
요약
- KVC는 문자열 키를 통해 객체의 프로퍼티에 간접적으로 접근하는 방법을 제공하며, 객체는 NSObject를 상속받고 @objc 어노테이션이 필요하다.
- KVO는 KVC를 확장하여 프로퍼티의 변경 사항을 관찰할 수 있는 방법을 제공하며, 관찰할 프로퍼티에는 @objc dynamic을 붙여야 한다. KVO를 사용할 때는 메모리 관리를 주의해야 하며, 적절한 해제를 통해 리소스를 관리해야 한다.
'Swift > CS' 카테고리의 다른 글
[iOS/TCA] TwoCounters로 TCA Scope알아보기 (0) | 2024.08.30 |
---|---|
GCD (0) | 2024.08.30 |
[iOS/TCA] 01-GettingStarted-Animations (0) | 2024.08.29 |
[iOS/SwiftUI] TCA 프로젝트 뜯어보기 (0) | 2024.08.26 |
[iOS/UIKit] UIKit 란 무엇일까 (0) | 2024.08.25 |