본문 바로가기
[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #49~#52 [Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #49~#52 출처 : Effective Objective-C #49 : 커스텀 메모리 관리 시맨틱을 가진 컬렉션을 만들기 위해 무비용 전환을 사용하라 무비용 전환은 Foundation 의 오브젝티브-C 객체와 CoreFoundation 의 C 데이터 구조체 간에 캐스팅을 할 수 있게 한다. CoreFoundation 으로 내려가 컬렉션을 생성하면 컬렉션이 자신의 데이터를 다룰 때 사용되는 다양한 콜백을 정의할 수 있다. 무비용 전환을 이용해 캐스팅하면 커스텀 메모리 관리 시맨틱을 갖는 오브젝티브-C 컬렉션을 만들 수 있다. #50 : 캐시가 필요할 때 NSDictionary 보다는 N.. 2017. 10. 21.
[Effective Objective-C] #49 커스텀 메모리 관리 시맨틱을 가진 컬렉션을 만들기 위해 무비용 전환을 사용하라 [Effective Objective-C] #49 커스텀 메모리 관리 시맨틱을 가진 컬렉션을 만들기 위해 무비용 전환을 사용하라 출처 : Effective Objective-C -NSArray 는 배열을 위한 Foundation 의 오브젝티브-C 클래스이다.그리고 CFArray 는 CoreFoundation 의 배열을 위한 것이다.배열을 생성하는 이 두 가지 방법은 별개로 보이지만 무비용 전환이라는 강력한 기능 덕에 이 두 클래스 간 캐스팅을 아주 긴밀하게 할 수 있다. -무비용 전환으로 Foundation 의 오브젝티브-C 클래스와 CoreFoundation 의 C 데이터 구조체 간에 캐스팅을 할 수 있다.나는 C 수준 API를 클래스나 객체가 아닌 데이터 구조체라고 부른다.그것들은 오브젝티브-C 의 .. 2017. 10. 17.
[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #41 ~ #48 [Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #41 ~ #48 출처 : Effective Objective-C #41 : 동기화에는 락보다는 디스패치 큐를 사용하라 동기화 문법을 제공하기 위해 디스패치 큐를 사용할 수 있다. 그리고 그냥 간단하게 @synchronized 블록이나 NSLock 객체를 이용해 동기화를 제공할 수도 있다. 동기화와 비동기화 디스패치를 함께 사용하는 것은 일반적인 락으로 하는 동기화와 동일한 기능을 제공할 수 있지만, 스레드에서 비동기 디스패치로 호출하면 잠금 없이 호출한다. 병렬 큐와 배리어 블록을 이용하면 동기화를 좀 더 효율적으로 할 수 있다. #42 : performSelector 메서드군보다는 .. 2017. 10. 16.
[Effective Objective-C] #47 시스템 프레임워크를 숙지하라 [Effective Objective-C] #47 시스템 프레임워크를 숙지하라 출처 : Effective Objective-C -시스템 프레임워크가 없어도 오브젝티브-C 를 사용할 수 있지만 그런 일은 매우 드물다.표준 최상위 클래스 NSObject 조차도 언어에 포함되어 있는 것이 아니라 Foundation 프레임워크에 포함되어 있다.Foundation 을 쓰는 것을 원하지 않으면 자신만의 최상위 클래스 뿐 아니라 자신만의 컬렉션, 이벤트 루프, 다른 유용한 클래스를 직접 만들어야 한다.게다가 시스템 프레임워크 없이 맥 OS X 와 iOS 앱을 오브젝티브-C 로 개발할 수 없다. -어떤 시스템 프레임워크가 있는지 모른다면 이미 만들어진 것도 또 다시 직접 모두 작성해야 할 것이다. -프레임워크는 동적 .. 2017. 10. 14.
[Effective Objective-C] #33 weak 참조를 사용하여 리테인 순환을 피하라 [Effective Objective-C] #33 weak 참조를 사용하여 리테인 순환을 피하라 출처 : Effective Objective-C -객체들끼리 서로를 어떠한 방법으로 참조하여 순환을 이루고 있는 객체 그래프(object graph)에서 순환이 발생하는 것을 흔히 볼 수 있다.순환이 발생하면 특정 지점에서 메모리 누수가 발생할 것이다.순환을 이루는 모든 객체가 결국엔 순환 밖에 있는 객체들에 의해 참조되지 않기 때문이다.그렇게 되면 순환 내의 객체에 접근할 수 있는 방법이 더는 없게 된다.그뿐 아니라 순환 내의 객체들은 서로를 할당 해제하지 않을 것이다.서로가 서로를 살아 있게 유지하기 때문이다. -리테인 순환 중 가장 간단한 것은 객체 두 개가 서로를 참조하는 것이다. -리테인 순환 내의 .. 2017. 9. 27.
[Effective Objective-C] #14 클래스 객체가 무엇인지 이해하라 [Effective Objective-C] #14 클래스 객체가 무엇인지 이해하라 출처 : Effective Objective-C -객체 타입은 컴파일 시간에 결정되지 않고 실행 시간에 찾는다. -컴파일러는 리시버가 이해할 수 없다고 생각되는 메시지를 보내는 것에 경고를 보낼 수 있다.반대로 id 타입의 객체는 모든 메시지에 응답할 수 있다고 여긴다. -실행 시간에 객체 타입을 알아내는 것을 내성(introspection)이라 하고, 이는 Foundation 프레임워크의 NSObject 의 프로토콜로 녹아 들어간 강렬하고 유용한 기능이다.이 프로토콜은 모든 공통 최상위 클래스(NSObject 와 NSProxy) 를 상속받는 모든 객체가 따르는 프로토콜이다.객체의 클래스를 직접 비교하는 것보다는 이런 메서.. 2017. 8. 16.
[Effective Java] 공유하는 가변 데이터에 접근 시 동기화하자. [Effective Java] 공유하는 가변 데이터에 접근 시 동기화하자. - 동기화를 하지 않으면, 하나의 스레드에서 변경한 내용을 다른 스레드에서 못 볼 수 있다. 동기화는 불안정 상태의 객체를 스레드가 볼 수 없도록 하는 것은 물론, 동기화된 메소드나 블록에 진입하는 각 스레드가 앞에서의 모든 변경(같은 락으로 보호되었던)이 반영된 결과를 볼 수 있게 해준다. - 자바 언어 명세에서는 long 이나 double 타입이 아닌 변수의 값을 읽거나 쓸 때는 원자성을 보장한다. long 이나 double 타입이 아닌 변수의 값을 읽으면 어떤 스레드가 그 변수에 저장했던 값을 반환 받을 수 있다는 것. 실제로 동기화하지 않고 여러 스레드가 그 변수를 동시에 수정해도 그때그때 수정된 값이 반영된다. 스레드가 .. 2017. 3. 7.
[Effective Java] null 대신 비어있는 배열이나 컬렉션을 반환하자. [Effective Java] null 대신 비어있는 배열이나 컬렉션을 반환하자. - 비어있는 배열이나 컬렉션 대신 null 을 반환하는 메소드를 사용할 때는 null checking 을 하는 복잡하고 긴 형태의 코드를 작성해야 한다. 또한 클라이언트 코드를 작성하는 프로그래머가 반환 값인 null 을 처리하는 코드 작성을 잊어버리면 NullPointerException 이 발생하기 쉽다. - 비어있는 배열보다는 null 값을 반환하는 것이 좋다는 주장도 있다. 배열을 생성하는 비용이 들지 않기 때문이다. 그러나 두 가지 면에서 이는 틀렸다. 1. 해당 메소드가 정말로 성능 문제의 원인인지 성능 프로파일에 나타나지 않으면 이런 경우에는 성능 우려를 할 것이 못 된다. 2. 길이가 0인 배열은 불변 객체이.. 2017. 1. 19.
[Effective Java] 타입 안전이 보장되는 혼성(heterogeneous) 컨테이너의 사용을 고려하자. [Effective Java] 타입 안전이 보장되는 혼성(heterogeneous) 컨테이너의 사용을 고려하자. - 제네릭은 Set 이나 Map 같은 컬렉션, ThreadLocal 이나 AtomicReference 같은 단일 요소(single-element) 저장 컨테이너에 가장 많이 사용된다. 이 컬렉션들은 컨테이너를 매개변수화 한 것이다. 컨테이너의 특성에 따라 사용 가능한 타입 매개변수의 갯수가 자연스럽게 제한된다. - 타입 안전을 지키면서 더 큰 유연성을 갖기 위해서 ( 예를 들면 nosql 처럼 column 이 상황에 따라 다른 경우 )는 컨테이너 대신 키(key) 를 매개변수화 해주면 된다. - Class 클래스는 1.5부터 제네릭화되었다. 클래스 리터럴 타입은 Class 가 아니고 Class.. 2016. 11. 22.
반응형