[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #49~#52 |
출처 : Effective Objective-C
#49 : 커스텀 메모리 관리 시맨틱을 가진 컬렉션을 만들기 위해 무비용 전환을 사용하라
무비용 전환은 Foundation 의 오브젝티브-C 객체와 CoreFoundation 의 C 데이터 구조체 간에 캐스팅을 할 수 있게 한다.
CoreFoundation 으로 내려가 컬렉션을 생성하면 컬렉션이 자신의 데이터를 다룰 때 사용되는 다양한 콜백을 정의할 수 있다.
무비용 전환을 이용해 캐스팅하면 커스텀 메모리 관리 시맨틱을 갖는 오브젝티브-C 컬렉션을 만들 수 있다.
#50 : 캐시가 필요할 때 NSDictionary 보다는 NSCache 를 사용하라
캐시로 사용한 NSDictionary 를 NSCache 로 변경하는 것을 고려하라.
캐시는 최적화된 메모리 반납 기능(pruning behavior)을 제공하고 스레드 안전할 뿐 아니라 사전처럼 키를 복사하지 않는다.
객체가 캐시에서 제거될 기준 지표로 수 제한(count limit)과 비용 제한(cost limit)을 사용하라.
그러나 그러한 지표를 너무 곧이곧대로 의지해서는 안 된다.
이 지표들은 단지 캐시가 보조로 참조하는 값일 뿐이다.
캐시를 NSPurgeableData 객체와 함게 사용하라.
이 객체는 자동 반납되는 데이터(autopurging data)를 제공한다.
이 기능은 이 객체가 자동으로 반납되면 캐시에서도 자동으로 제거된다는 것을 말한다.
캐시를 잘 사용하면 앱 응답 시간을 꽤 줄일 수 있다.
네트워크에서 가져오거나 디스크에서 읽는 것처럼 다시 계산하는 비용이 큰 데이터만 캐싱하라.
#51 : initialize 와 load 메서드는 간결하게 만들라
클래스가 load 메서드를 구현했고 그 메서드가 호출되면 클래스는 로드 단계(load phase)로 진입한다.
이 메서드는 또한 카테고리에도 있을 수 있다.
그것으로 인해 클래스는 항상 카테고리가 로드되기 전에 로드된다.
load 메서드는 다른 메서드들이 지키는 일반적인 재정의 방침을 따르지 않는다.
클래스가 최초로 사용되기 전에 initialize 메서드가 호출된다.
이 메서드는 일반적인 재정의 규칙을 따른다.
그래서 이 메서드는 클래스가 초기화되었는지 확인하는 최적의 장소다.
load 와 initialize, 이 두 메서드는 모두 간결하게 유지해야 한다.
그렇게 하면 앱이 계속 응답을 잘 하고 상호 참조가 발생할 가능성을 줄이는 데 도움이 된다.
컴파일 시간에 할 수 없는 전역 상태값을 설정하는 것은 initialize 메서드에서 하라.
#52 : NSTimer 가 타깃을 리테인한다는 사실을 기억하라.
NSTimer 객체는 타이머의 이벤트가 발생되거나 명시적인 invalidate 호출을 통해 타이머가 종료되기 전까지 자신의 타깃을 리테인한다.
반복하는 타이머를 사용하면서 타이머의 타깃이 타이머를 리테인하면 리테인 순환이 쉽게 발생한다.
이는 객체 그래프의 다른 객체에 의해 직간접적으로 생길 수 있다.
NSTimer 가 블록을 사용하도록 확장하면 리테인 순환을 깰 수 있다.
아직 공식적으로 NSTimer 인터페이스에 이 기능이 추가되지 않았기 때문에 현재는 카테고리를 이용해 이 기능을 추가할 수 있다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[ios/design pattern] private 메서드 정의하기 (0) | 2017.10.23 |
---|---|
[Effective Objective-C] 총 정리 (0) | 2017.10.22 |
[Effective Objective-C] #52 NSTimer 가 타깃을 리테인한다는 사실을 기억하라 (0) | 2017.10.20 |
[Effective Objective-C] #51 initialize 와 load 메서드는 간결하게 만들라 (0) | 2017.10.19 |
[Effective Objective-C] #50 캐시가 필요할 때 NSDictionary 보다는 NSCache 를 사용하라 (0) | 2017.10.18 |
댓글