Programming/Mac & iOS

[iOS] KVC, KVO

MB Brad KWON 2016. 4. 19. 16:07

KVC (Key-Value-Coding) 


    KVC는 문자열을 이용해 property에 접근할 수 있게 해주는 기능이다. 접근자를 이용하지 않고 property의 이름인 문자열로 접근하므로, 객체간 의존성을 낮추고 결합도가 낮은 소프트웨어 개발을 할 수 있게 해준다. KVC를 구현한 메소드는 NSKeyValueCoding 프로토콜에 의해 정의되며, NSObject는 이 프로토콜을 implement한 상태이다. KVC는 아래와 같은 로직으로 동작한다.


1. key와 일치하는 property를 찾는다.

2. 일치하는 property가 없을 경우, key와 일치하는 인스턴스 변수를 찾는다. 

3. 일치하는 property나 인스턴스 변수가 있으면, 이를 적용한다. 없으면 'valueForUndefinedKey:'나 'setValue:forUndefinedKey:'를 호출한다.


    위와 같은 로직으로 동작하기 때문에 property를 통한 직접적 접근보다 느리며, runtime에서 접근하기 때문에 key가 일치하지 않아 crash가 발생하기도 한다. 소프트웨어 구조적 측면에서 유연성이 필요한 경우에만 사용하는 것이 좋다.


    KVC는 아래에서 언급할 KVO와 Cocoa binding, Core Data, Apple script의 기술적 기반이 된다.


    collection에 KVC를 적용할 경우, 사용할 수 있는 특수한 property들이 생긴다. 해당 property들은 아래와 같다.


@count

@avg

@max

@min

@sum

@distinctUnionOfObjects

@unionOfObjects

@distinctUnionOfArrays

@unionOfArrays

@distinctUnionOfSets




KVO (Key-Value-Observing)


    KVO는 객체의 property가 변경되는 것을 알고 싶을 때 사용하는 기능이다. 위에서 설명한 KVC와 같이 keypath를 통한 property의 변경을 감지하고 알려준다.