[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #25 ~ #32
출처 : Effective Objective-C
#25 : 서드 파티 클래스에는 반드시 카테고리 이름을 접두어로 붙이라
자신이 소유하지 않은 클래스에 카테고리를 추가할 때는 항상 카테고리 이름에 접두어를 붙이라.
자신이 소유하지 않은 클래스에 카테고리를 추가할 때 카테고리의 메서드에도 접두어를 항상 붙이라.
#26 : 카테고리에는 프로퍼티를 사용하지 말라
데이터를 캡슐화하는 모든 프로퍼티 선언은 메인 인터페이스 파일에서 하라.
클래스 확장 카테고리를 제외하고 카테고리 내에 프로퍼티를 선언하기보다는 접근자 메서드를 사용하라.
#27 : 클래스 확장 카테고리를 이용해 상세한 구현을 숨기라
클래스에 인스턴스 변수를 추가하기 위해 클래스 확장 카테고리를 사용하라.
메인 인터페이스에 있는 읽기 전용 프로퍼티를 클래스 내부에서는 세터 접근자를 이용해 값을 설정할 수 있도록 하고 싶으면 클래스 확장 카테고리에 그 프로퍼티를 읽기 쓰기로 재선언하라.
프라이빗 메서드를 위한 메서드 프로토타입은 클래스 확장 카테고리 내에 선언하라.
클래스가 따르는 프로토콜 정보를 내부에 숨기고 싶으면 클래스 확장 카테고리를 사용하라.
#28 : 프로토콜을 이용해 익명 객체를 제공하라
프로토콜은 객체의 타입을 익명으로 만들기 위해 사용될 수 있다.
프로토콜 메서드를 구현하는 타입은 id 타입으로 줄일 수 있다.
타입(클래스 이름)을 숨겨야 할 때는 익명 객체를 사용하라.
어느 클래스 타입이든 별로 상관없고 특정(또는 프로토콜에 정의되어 있는) 메서드에 응답하는 사실이 더 중요할 때 익명 객체를 사용하라.
#29 : 참조 세기를 이해하라
참조 세기 메모리 관리는 카운터를 증가/감소시키는 방법으로 동작한다.
객체는 적어도 1의 카운트를 가지고 생성된다.
리테인 수가 양수인 객체는 살아 있다.
리테인 수가 0으로 떨어지면 객체는 파괴된다.
객체의 생애 주기 동안 객체는 이 객체의 참조를 가진 다른 객체에 의해 리테인되고 릴리스된다.
리테인하는 것과 릴리스하는 것은 각각 리테인 수를 증가시키고 감소시킨다.
#30 : ARC 를 사용하여 참조 세기를 쉽게 만들라
ARC 는 개발자가 대부분의 메모리 관리에 대해 신경 쓰지 않게 해준다.
클래스의 보일러플레이트 코드를 없애주는 ARC 를 사용하라.
ARC 는 적절한 곳에 retain, release 를 추가함으로써 객체 생애 주기 거의 대부분을 다룬다.
변수 식별자(qualifier)는 메모리 관리 시맨틱을 가리키기 위해 사용될 수 있다.
이전에는 retain, release 가 수동으로 배치되었다.
반환하는 객체의 메모리 관리 시맨틱을 알리기 위해 메서드 이름이 사용된다.
ARC 는 이것을 견고하게 만들었고 이 규칙을 따르지 않는 것은 불가능하다.
ARC 는 오직 오브젝티브-C 객체만 다룬다.
이는 ARC 가 CoreFoundation 객체를 다루지 않는다는 것을 의미한다.
그래서 적절한 CFRetain/CFRelease 호출이 반드시 적용되어야 한다.
#31 : 참조를 릴리스하고 관찰 상태(observation state)를 정리하는 일은 dealloc 메서드에서만 하라
dealloc 메서드는 오직 다른 객체의 참조를 릴리스하고 키-값 관찰자나 NSNotification Center 알림 같은 것을 등록 해제하는 데만 사용되어야 한다.
객체가 파일 디스크립터 같은 시스템 자원을 잡고 있으면
이러한 리소스를 반납하기 위한 메서드가 있어야 한다.
이러한 자원의 사용이 끝났을 때 클래스의 사용자가 close 메서드를 반드시 호출하게 해야 한다.
dealloc 메서드 내에서 비동기 작업을 하는 메서드나
절대로 될 수 없는 상태로 변하는 것을 가정하는 메서드는 호출하지 말아야 한다.
#32 : 안전한 예외 처리 코드를 작성하려면 메모리 관리를 주의 깊게 다루라
예외가 잡혔을 때 try 블록 내에서 생성한 객체는 반드시 필요한 정리 작업이 수행되도록 보장하라.
기본으로 ARC 는 예외가 발생했을 때 정리를 하는 코드를 만들어 내진 않는다.
이는 컴파일러 표식으로 동작하게 설정할 수 있다.
그러나 많은 양의 코드를 만들어 낼 것이고 런타임 성능에 좋지 않은 영향을 미칠 것이다.
댓글