본문 바로가기
프로그래밍 놀이터/iOS

[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #33 ~ #40

by 돼지왕 왕돼지 2017. 10. 5.
반응형

 [Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #33 ~ #40


출처 : Effective Objective-C

@autoreleasepool, arc, autorelease pool, block retain cycle, block typedef, completion block, deprecated, ISA, isa pointer zombie, Memory, nil, nszombieenabled, retain count, retain cycle, retainCount, retainCount 를 사용하지 말라., typedef, weak 참조, Weak 참조를 사용하여 리테인 순환을 피하라., Zombie, 델리게이트, 렉시컬 클로저, 리테인 순환, 많이 사용하는 블록 타입은 typedef 를 이용해 타입을 생성하라, 블록, 블록 리테인 순환, 블록을 이해하라, 블록이 자신을 소유한 객체를 다시 소유함으로써 발생하는 리테인 순환을 조심하라., 스택, 스택 메모리, 스탹, 시그너처, 오토릴리스 풀, 오토릴리스 풀을 사용하여 최고 메모리 사용량을 낮추라, 전역, 전역 메모리, 좀비, 좀비를 이용해 메모리 관리 오류를 디버깅하라., 컴파일 에러, 핸들러 블록, 핸들러 블록을 사용해 코드가 여러 개로 나뉘는 것을 막으라., 힙, 힙 메모리


#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 사용자에게 이 책임을 전가하면 안 된다.




반응형

댓글