[Effective Objective-C] #7 인스턴스 변수에 내부에서 접근할 때는 직접 접근하라.
출처 : Effective Objective-C
-
인스턴스 변수를 읽을 때는 직접 접근하고, 쓸 때는 프로퍼티를 사용하는 방법을 강력하게 추천한다.
-
인스턴스 변수에 직접 접근하는 방법이 확실히 빠르다.
이 방법은 Objective-C 의 메서드 호출(dispatch)를 사용하지 않는다.
컴파일러는 객체의 인스턴스 변수가 저장된 메모리에 직접 접근하는 코드를 만들어 낼 것이다.
-
직접 접근하는 방법은 세터에 정의된 메모리 관리 시멘틱을 무시한다.
-
인스턴스 변수에 직접 접근하면 키-값 관찰(key-value observing:KVO) 알림이 발생하지 않을 것이다.
이는 기대하는 객체의 동작 방식에 따라 문제가 될 수도, 안 될 수도 있다.
-
프로퍼티를 통해 접근하면 프로퍼티에 관련된 문제를 디버깅하기 쉽다.
게터나 세터에 중단점(break point)를 추가하여 누가, 언제 프로퍼티에 접근하는지 알 수 있기 때문이다.
-
앞의 두 장점을 모두 활용하는 방법은 인스턴스 변수를 설정할 때는 세터를 이용하고,
읽을 때는 직접 읽는 방법이다.
이렇게 하면 빠르게 인스턴스 변수를 읽을 수 있고, 프로퍼티를 통한 쓰기 제어를 여전히 사용할 수 있는 장점을 누릴 수 있다.
-
세터를 통해 쓰는 가장 큰 이유는 프로퍼티에 대한 메모리 관리 시멘틱의 동작이 보장되기 때문이다.
그러나 이 방법은 몇 가지 주의해야 할 점이 있다.
-
첫번째 주의할 점은 초기화 메서드 내에서 값을 설정할 때다.
이 메서드에서는 항상 인스턴스 변수에 직접 접근해야 한다.
하위 클래스가 세터를 재정의(override)할 수 있기 때문이다.
-
또 다른 주의할 점은 프로퍼티가 지연 초기화(lazy initialization)을 사용할 때이다.
이 경우에는 반드시 게터를 사용해야 한다.
그렇게 하지 않으면 인스턴스 변수는 절대 초기화될 기회를 얻지 못할 것이다.
-
기억할 점
내부에서는 인스턴스 변수를 읽을 때는 직접 접근해 읽고, 반대로 쓸 때는 프로퍼티를 이용하라.
초기화 메서드와 dealloc 에서는 항상 인스턴스 변수를 직접 읽고 쓰라.
데이터(즉 인스턴스 변수)가 지연 초기화를 이용한다면 프로퍼티를 이용해 데이터를 읽어야 한다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #1 ~ #8 (0) | 2017.08.10 |
---|---|
[Effective Objective-C] #8 객체의 동등 비교를 이해하라 (0) | 2017.08.09 |
[Effective Objective-C] #6 프로퍼티를 이해하라 (0) | 2017.07.27 |
[Effective Objective-C] #5 열거형을 사용해 상태, 옵션, 상태 코드를 정의하라 (0) | 2017.07.26 |
[Objective-C] Objective-C++ 이란? (0) | 2017.07.25 |
댓글