[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #33 ~ #40 |
출처 : Effective Objective-C
#33 : Weak 참조를 사용하여 리테인 순환을 피하라.
참조를 weak 로 만들면 리테인 순환을 피할 수 있다.
weak 참조는 자동으로 nil 로 채워질 수도, 채워지지 않을 수도 있다.
자동으로 nil 로 설정되는 것은 ARC 에서 소개된 새로운 기능이다.
그리고 런타임에서 구현되었다.
자동으로 nil 로 채워지는 weak 참조를 읽는 것은 항상 안전하다(반드시 정상 객체가 아니면 nil 이기 때문).
그 말은 절대로 할당 해제되는 참조를 포함하지 않는다는 것이다.
#34 : 오토릴리스 풀을 사용하여 최고 메모리 사용량을 낮추라
오토릴리스 풀은 스택에 저장(arrange)된다.
오토릴리스 메시지를 받은 객체는 스택의 가장 위(top)에 있는 풀에 추가된다.
오토릴리스 풀들을 올바르게 사용하면 앱의 최고 메모리 사용량을 낮추는 데 도움이 된다.
새로운 @autoreleasepool 문법을 사용하여 오토릴리스 풀을 쓰면 비용이 훨씬 저렴하다.
#35 : 좀비를 이용해 메모리 관리 오류를 디버깅하라.
객체가 할당 해제되었을 때 할당 해제되는 대신 좀비로 바꿀 수 있다.
이 기능은 NSZombieEnabled 환경 표식을 이용해 활성화 할 수 있다.
객체의 클래스를 특별한 좀비 클래스로 변경하기 위해 isa 포인터를 조작해서 객체를 좀비로 바꾼다.
좀비 클래스는 어떤 객체에 어떤 메시지를 보냈는지 알리는 메시지를 출력하고 앱을 종료함으로써 모든 선택자에 응답한다.
#36 : retainCount 를 사용하지 말라.
객체의 리테인 수는 유용해 보이지만 보틍은 그렇지 않다.
특정 시간의 절대 리테인 수는 객체 생애 주기의 완전한 그림을 보여주지 않기 때문이다.
ARC 를 도입하면서 retainCount 메서드는 폐기되었다.
그리고 이 메서드를 사용하면 컴파일 에러가 일어난다.
#37 : 블록을 이해하라
블록은 C, C++ 오브젝티브-C 를 위한 렉시컬 클로저다.
블록은 선택적으로 파라미터를 받거나 값을 반환할 수 있다.
블록은 스택, 힙, 전역으로 할당할 수 있다.
스택으로 할당된 블록은 힙으로 복제할 수 있다.
이 지점에서 이 블록은 일반 오브젝티브-C 객체 같이 참조 수를 셀 수 있게 된다.
#38 : 많이 사용하는 블록 타입은 typedef 를 이용해 타입을 생성하라
타입 정의를 사용해 블록 변수를 쉽게 사용할 수 있게 만들라.
새로운 타입을 만들 때 다른 타입의 이름과 겹치지 않게 하기 위해 이름 짓기 규칙을 따르라.
블록 시그너처가 같은 타입 여러 개를 정의하는 것을 두려워하지 말라.
블록 시그너처를 한 군데만 변경해서 특정 블록 타입을 전부 리펙터링할 수 있길 원할 것이다.
#39 : 핸들러 블록을 사용해 코드가 여러 개로 나뉘는 것을 막으라.
객체를 생성하는 곳에 핸들러의 비지니스 로직을 인라인으로 같이 선언하는 게 유용하다면 핸들러 블록을 이용해 하라.
핸들러 블록은 델리게이트와는 다르게 직접 객체에 연관될 수 있는 장점이 있다.
델리게이트를 사용할 때 관찰해야 할 인스턴스가 여러 개이면 인스턴스에 따라 바꾸어 처리해야 한다.
핸들러 블록을 사용하는 API 를 설계할 때 블록이 들어갈(enqueue)큐를 API 파라미터로 전달하라.
#40 : 블록이 자신을 소유한 객체를 다시 소유함으로써 발생하는 리테인 순환을 조심하라.
블록에 잡힌 객체가 직간접적으로 다시 그 블록을 리테인할 때 발생하는 리테인 순환을 조심하라.
특정 시점에서 반드시 리테인 순환이 깨질 것이라는 점을 보장하라.
여러분의 API 사용자에게 이 책임을 전가하면 안 된다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[Effective Objective-C] #42 performSelector 메서드군보다는 GCD 를 사용하라 (0) | 2017.10.07 |
---|---|
[Effective Objective-C] #41 동기화에는 락보다는 디스패치 큐를 사용하라 (0) | 2017.10.06 |
[Effective Objective-C] #40 블록이 자신을 소유한 객체를 다시 소유함으로써 발생하는 리테인 순환을 조심하라 (0) | 2017.10.04 |
[Effective Objective-C] #39 핸들러 블록을 사용해 코드가 여러 개로 나뉘는 것을 막으라 (0) | 2017.10.03 |
[Effective Objective-C] #38 많이 사용하는 블록 타입은 typedef 를 이용해 타입을 생성하라 (0) | 2017.10.02 |
댓글