어쩌다보니 iOS 개발자
5. 인스턴스 변수에 내부에서 접근할 때는 직접 접근하라 본문
1. 프로퍼티 점 문법과 접근자 메서드를 통해 인스턴스 변수 접근
_fullName = @"임동민";
2. 직접 접근 방법
self.fullName = @"임동민";
위 두가지 방법은 몇 가지 차이점이 있다.
1. 직접 접근 방법이 확실히 빠르다. 메서드를 접근하지 않고 직접 메모리에 접근하는 코드를 만들어 처리한다.
2. 직접 접근 방법은 세터에 정의된 메모리 관리 시맨틱을 무시한다. 예를 들어 프로퍼티가 copy 속성으로 정의되었더라도 인스턴스 변수를 직접 설정하면 복사본을 만들지 않을 것이다. 새로운 값은 리테인되고 이전 값은 릴리즈 된다.
3. 인스턴스 변수에 직접 접근하면 키-값 관찰(Key-Value Observing: KVO)알림이 발생하지 않을 것이다.
4. 프로퍼티를 통해 접근하면 프로퍼티에 관련된 문제를 디버깅하기 쉽다.
앞의 두 장점을 활용하는 방법
인스턴스 변수에 값을 설정할 때는 세터 메소드를 이용하고, 읽을 때는 직접 읽는 방식을 사용한다.
주의할 점
- 초기화 값을 설정할 때이다. 상속한 하위 클래스에서 override 를 했는지 파악을 한 후 세터를 override 했다면 파악 후 하위 클래서 세터를 사용할 지 아니면 그직접 접근하여 값을 설정할지 정해야 한다.
- 초기화를 진행하지도 않고 직접 접근했을 경우를 대비해 게터가 아래처럼 되어있고
- (Test *)testbrain {
if (!_testbrain) {
_testbrain = [TestBrain new];
}
return _testbrain;
}
만약 직접 접근 한다면 아래 게터를 거치치 않고 값을 가져오면 nil값이 있을 것이다. 만약 초기화를 진행하지 않고 바로 값을 가져오고자 한다면 프로퍼티
_brain 언어바를 이용해서 가져와야한다
이번에 가장 깨달은 점은 self. _ 의 접근 방법이 다르다는 것이다.
직접 접근과 메서드 접근이라는 것...
개발 하다가 까끔 세터가 적용이 안되면 self.로 값을 설정하면 되어서 그냥 생각없이 넘어갔던 문제가
이번 이론으로 해결이 되었다.
'iOS 개발 > 이펙티브 오브젝티브-C' 카테고리의 다른 글
4. 프로퍼티를 이해하라 (0) | 2017.09.18 |
---|---|
3. 전처리기 #define 보다는 타입이 있는 상수를 사용하라 (0) | 2017.09.13 |
2. 헤더에 헤더를 포함하는 것을 최소화하라. (0) | 2017.09.13 |
1. 오브젝티브-C의 기원과 친숙해져라. (0) | 2017.09.11 |
Comments