본문 바로가기
프로그래밍 놀이터/iOS

[Effective Objective-C] #7 인스턴스 변수에 내부에서 접근할 때는 직접 접근하라.

by 돼지왕 왕돼지 2017. 7. 28.
반응형

 [Effective Objective-C] #7 인스턴스 변수에 내부에서 접근할 때는 직접 접근하라.


출처 : Effective Objective-C

break point, dispatch, effective objective-c, key value observing, kvo, lazy initialization, Objective-C, override, [Effective Objective-C] #7 인스턴스 변수에 내부에서 접근할 때는 직접 접근하라., 게터, 디버깅, 메모리 관리 시멘틱, 세터, 속도, 쓸 때 프로퍼티, 인스턴스 변수, 재정의, 초기화 메서드, 추천, 키 값 관찰, 프로퍼티


-

인스턴스 변수를 읽을 때는 직접 접근하고, 쓸 때는 프로퍼티를 사용하는 방법을 강력하게 추천한다.



-

인스턴스 변수에 직접 접근하는 방법이 확실히 빠르다.

이 방법은 Objective-C 의 메서드 호출(dispatch)를 사용하지 않는다.

컴파일러는 객체의 인스턴스 변수가 저장된 메모리에 직접 접근하는 코드를 만들어 낼 것이다.



-

직접 접근하는 방법은 세터에 정의된 메모리 관리 시멘틱을 무시한다.



-

인스턴스 변수에 직접 접근하면 키-값 관찰(key-value observing:KVO)  알림이 발생하지 않을 것이다.

이는 기대하는 객체의 동작 방식에 따라 문제가 될 수도, 안 될 수도 있다.



-

프로퍼티를 통해 접근하면 프로퍼티에 관련된 문제를 디버깅하기 쉽다.

게터나 세터에 중단점(break point)를 추가하여 누가, 언제 프로퍼티에 접근하는지 알 수 있기 때문이다.



-

앞의 두 장점을 모두 활용하는 방법은 인스턴스 변수를 설정할 때는 세터를 이용하고,

읽을 때는 직접 읽는 방법이다.

이렇게 하면 빠르게 인스턴스 변수를 읽을 수 있고, 프로퍼티를 통한 쓰기 제어를 여전히 사용할 수 있는 장점을 누릴 수 있다.



-

세터를 통해 쓰는 가장 큰 이유는 프로퍼티에 대한 메모리 관리 시멘틱의 동작이 보장되기 때문이다.

그러나 이 방법은 몇 가지 주의해야 할 점이 있다.



-

첫번째 주의할 점은 초기화 메서드 내에서 값을 설정할 때다.

이 메서드에서는 항상 인스턴스 변수에 직접 접근해야 한다.

하위 클래스가 세터를 재정의(override)할 수 있기 때문이다.



-

또 다른 주의할 점은 프로퍼티가 지연 초기화(lazy initialization)을 사용할 때이다.

이 경우에는 반드시 게터를 사용해야 한다.

그렇게 하지 않으면 인스턴스 변수는 절대 초기화될 기회를 얻지 못할 것이다.



-

기억할 점

     내부에서는 인스턴스 변수를 읽을 때는 직접 접근해 읽고, 반대로 쓸 때는 프로퍼티를 이용하라.


     초기화 메서드와 dealloc 에서는 항상 인스턴스 변수를 직접 읽고 쓰라.


     데이터(즉 인스턴스 변수)가 지연 초기화를 이용한다면 프로퍼티를 이용해 데이터를 읽어야 한다.




반응형

댓글