[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #41 ~ #48 |
출처 : Effective Objective-C
#41 : 동기화에는 락보다는 디스패치 큐를 사용하라
동기화 문법을 제공하기 위해 디스패치 큐를 사용할 수 있다.
그리고 그냥 간단하게 @synchronized 블록이나 NSLock 객체를 이용해 동기화를 제공할 수도 있다.
동기화와 비동기화 디스패치를 함께 사용하는 것은 일반적인 락으로 하는 동기화와 동일한 기능을 제공할 수 있지만,
스레드에서 비동기 디스패치로 호출하면 잠금 없이 호출한다.
병렬 큐와 배리어 블록을 이용하면 동기화를 좀 더 효율적으로 할 수 있다.
#42 : performSelector 메서드군보다는 GCD 를 사용하라
performSelector 메서드군을 사용하면 메모리 관리가 어렵다.
어떤 선택자가 실행될 것인지 알 수 없다면 ARC 컴파일러는 적절한 메모리 관리 호출을 코드에 삽입할 수 없을 것이다.
이 메서드군은 반환 타입과 메서드에 전달할 수 있는 파라미터 개수가 매우 한정적이다.
선택자를 다른 스레드에서 실행하기 위해서는 블록을 사용하는 GCD 를 호출하는 방법을 이용하라.
#43 : GCD 가 필요한 때와 작업 큐가 필요한 때를 구분해서 알아두라
디스패치 큐는 멀티스레드와 테스크 관리의 유일한 해결책은 아니다.
작업 큐는 GCD 가 하는 대부분의 일을 할 수 잇는 고수준 오브젝티브-C API 를 제공한다.
또한 이러한 큐들은 GCD 로 한다면 추가적인 코드를 작성해야 하는 좀 더 복잡한 일들을 쉽게 할 수 있다.
#44 : 플랫폼 확장의 이점을 얻으려면 디스패치 그룹을 사용하라
디스패치 그룹은 작업들을 그룹 짓기 위해 사용된다.
선택적으로 그룹이 실행이 끝났을 때 알림을 받을 수 있다.
디스패치 그룹은 병렬 디스패치 큐에 있는 다수의 작업을 병렬로 실행하려 할 때 사용될 수 있다.
이 경우 GCD 는 다수의 작업을 시스템 리소스에 기반을 두고 동시에 수행되도록 스케줄링한다.
이를 직접 구현하려면 많은 코드를 작성해야 한다.
#45 : 스레드 안전한 단일 시간 코드 실행은 dispatch_once 를 이용하라
스레드 안전 단일 코드 (single-code) 실행은 흔히 하는 작업이다.
GCD 는 이를 위한 사용하기 쉬운 dispatch_once 함수라는 도구를 제공한다.
토큰은 static 이나 global 로 선언해야 한다.
반드시 한 번만 실행되어야 하는 각 블록을 위해 전달되는 토큰이 같은 것이어야 하기 때문이다.
#46 : dispatch_get_current_queue 사용을 피하라
dispatch_get_current_queue 함수는 기대한 것처럼 동작하지 않는다.
이 함수는 폐기되었다.
그래서 디버깅 할 때만 사용해야 한다.
디스패치 큐는 계층 구조로 구성되어 있다.
그렇기 때문에 현태 큐를 간단히 단일 큐 객체로 표현할 수 없다.
큐 전용 데이터는 dispatch_get_current_queue 를 사용해야 하는 곳을 대체할 수 있다.
이를 사용하면 재진입 코드 때문에 발생하는 데드락을 회피할 수 있다.
#47 : 시스템 프레임워크를 숙지하라
활용할 수 있는 시스템 프레임워크가 많다.
가장 중요한 프레임워크는 Foundation 과 CoreFoundation 인데 앱 개발에 필요한 많은 핵심 기능을 제공한다.
오디오, 비디오 처리, 네트워킹, 데이터 관리 같은 많은 공통 작업을 위한 프레임워크가 있다.
오브젝티브-C 가 아닌 오직 C 만으로 작성된 프레임워크가 있다는 것을 꼭 알고 있어야 한다.
그래서 좋은 오브젝티브-C 개발자가 되기 위해서는 C 의 기본 개념을 이해해야 한다.
#48 : 반복문에는 블록 열거를 사용하라
컬렉션을 열거하는 방법은 네 가지가 있다.
for 루프는 가장 기초적인 방법이다.
그 다음은 NSEnumerator 와 빠른 열거를 사용해 열거하는 것이다.
가장 현대적이고 진보된 방법은 블록 열거 메서드를 사용하는 방법이다.
블록 열거는 추가 코드 없이 GCD 를 활용하여 병렬로 열거를 할 수 있게 한다.
이는 다른 열거 방법으로는 하기 어려운 일이다.
만약 알고 있다면 블록 시그너처에서 정확한 객체 타입을 가리키도록 수정하라.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[Effective Objective-C] #50 캐시가 필요할 때 NSDictionary 보다는 NSCache 를 사용하라 (0) | 2017.10.18 |
---|---|
[Effective Objective-C] #49 커스텀 메모리 관리 시맨틱을 가진 컬렉션을 만들기 위해 무비용 전환을 사용하라 (0) | 2017.10.17 |
[Effective Objective-C] #48 반복문에는 블록 열거를 사용하라 (0) | 2017.10.15 |
[Effective Objective-C] #47 시스템 프레임워크를 숙지하라 (0) | 2017.10.14 |
[Effective Objective-C] #46 dispatch_get_current_queue 사용을 피하라 (0) | 2017.10.13 |
댓글