본문 바로가기
[Effective Objective-C] #40 블록이 자신을 소유한 객체를 다시 소유함으로써 발생하는 리테인 순환을 조심하라 [Effective Objective-C] #40 블록이 자신을 소유한 객체를 다시 소유함으로써 발생하는 리테인 순환을 조심하라 출처 : Effective Objective-C -블록을 주의 깊게 사용하지 않으면 리테인 순환이 쉽게 발생한다. -완료 핸들러 블록은 리테인 순환이 발생할 수 있는 참조를 nil 로 만들어 주어야 한다. -이 리테인 순환 문제는 완료 콜백 블록을 사용하는 API 에서 흔히 발생하는 것이다.그렇기 때문에 꼭 알고 있어야 한다.이 문제는 적절한 순간에 참조 중 하나를 제거함으로써 풀 수 있다.그러나 항상 참조를 제거할 수 있는 순간이 온다고 보장할 수 없다.예를 들어 리테인 순환은 오직 완료 핸들러가 동작할 때만 깨질 수 있다.완료 핸들러가 실행되지 않으면 리테인 순환이 결코 깨.. 2017. 10. 4.
[Effective Objective-C] #39 핸들러 블록을 사용해 코드가 여러 개로 나뉘는 것을 막으라 [Effective Objective-C] #39 핸들러 블록을 사용해 코드가 여러 개로 나뉘는 것을 막으라 출처 : Effective Objective-C -특정 상황에서 앱이 특정 시간 동안 응답하지 않으면 자동으로 종료될 수 있다.특히 iOS 앱은 반드시 종료된다.시스템 와치독(system watchdog)은 특정 시간 동안 메인 스레드가 중단된 앱은 강제로 종료시킨다. -비동기 메서드를 쓰면 일을 끝냈을 때 완료 사실을 알고 싶어 하는 것들에 완료 사실을 알려주는 방법이 필요하다.이를 할 수 있는 방법이 몇 가지 있다.일반적으로 쓰는 방법은 객체가 따를 수 있는(conform) 델리게이트 프로토콜을 이용하는 것이다.델리게이트 객체는 비동기 작업의 완료 같은 적절한 이벤트가 발생하면 알림을 받을 수.. 2017. 10. 3.
[Effective Objective-C] #38 많이 사용하는 블록 타입은 typedef 를 이용해 타입을 생성하라 [Effective Objective-C] #38 많이 사용하는 블록 타입은 typedef 를 이용해 타입을 생성하라 출처 : Effective Objective-C -블록은 내재 타입(inherent)이다.블록은 적절한 타입의 변수에 할당될 수 있다. -블록의 타입은 다음과 같이 생겼다.return_type (^block_name) (paramters) 블록 변수(block-variable) 정의는 변수 이름을 맨 오른쪽에 두는 다른 타입들과 달리 변수 이름을 가운데 둔다.이로 인해 블록 타입 정의 문법을 기억하고 읽기가 매우 어려워진다.그렇기 때문에 자주 사용되는 블록 타입을 위한 타입 정의를 만드는 것은 좋은 생각이다.특히 다른 사람들이 사용하는 API 일 때 유용하다.이와 같이 이름 뒤에 블록 타.. 2017. 10. 2.
[Effective Objective-C] #37 블록을 이해하라 [Effective Objective-C] #37 블록을 이해하라 출처 : Effective Objective-C -맥 OS X 내에서 UI 스레드가 멈추면 그 무시무시한 돌고 있는 비치볼을 보게 될 것이다.iOS 에서는 앱이 너무 오랫동안 멈추어 있으면 강제로 종료될 것이다. -멀티스레딩의 핵심 기술은 블록과 GCD(Grand Central Dispatch) 다.블록은 C, C++. 오브젝티브-C 에 렉시컬 클로저(lexical closure)를 제공하는데 이는 매우 유용하다.( 클로저는 함수 내에 함수를 선언할 수 있게 하는 기능이다. 리스프 계열 언어에서 많이 쓰이며, 내부에 선언된 함수는 외부 함수의 파라미터들을 참조할 수 있다. )블록은 코드를 전달하는 기법을 제공한다. -GCD는 스레딩을 이른.. 2017. 10. 1.
[Effective Objective-C] #36 retainCount 를 사용하지 말라 [Effective Objective-C] #36 retainCount 를 사용하지 말라 출처 : Effective Objective-C -NSObject 프로토콜에 정의된 이 메서드로 객체의 현재 리테인 수를 얻을 수 있다.- (NSUInteger)retainCount -그러나 ARC 는 이 메서드를 폐기했다.실제로 ARC 를 사용하면서 retain, release, autorelease 를 호출하는 것처럼 retainCount 를 호출하면 컴파일러가 에러를 던질 것이다.이 메서드가 공식적으로 폐기 되었는데도 많은 사람들이 잘못 이해하고 있다. -ARC 를 사용하지 않는다면 이 메서드를 사용할 수 있고 컴파일 에러도 받지 않을 것이다.그렇기 때문에 이 메서드를 사용하지 말아야 하는 이유를 반드시 알아야.. 2017. 9. 30.
[Effective Objective-C] #35 좀비를 이용해 메모리 관리 오류를 디버깅하라 [Effective Objective-C] #35 좀비를 이용해 메모리 관리 오류를 디버깅하라 출처 : Effective Objective-C -메모리 관리 오류를 디버깅하는 것은 매우 어려운 일이다.할당 해제된 객체에 메시지를 보내는 일은 예상할 수 있듯이 전혀 안전하지 못하다.그러나 때때로 그것은 동작하기도 하고 동작하지 않기도 하는데 이는 객체가 사용했던 메모리를 덮어 썼느냐에 달려있다.메모리가 재사용되었는지 알 수 있는 방법은 없다.그로 인해 크래시가 가끔 일어난다.메모리의 일부분만 재사용되는 경우도 있는데 이 때 객체의 일부분은 여전히 유효하다.또한 순전히 운으로 또 다른 유효한 살아 있는 객체가 메모리를 덮어쓸 수도 있다.이 경우 런타임은 새로운 객체에 메시지를 보낼 것이고 객체는 응답을 할 .. 2017. 9. 29.
[Effective Objective-C] #34 오토릴리스 풀을 사용하여 최고 메모리 사용량을 낮춰라 [Effective Objective-C] #34 오토릴리스 풀을 사용하여 최고 메모리 사용량을 낮춰라 출처 : Effective Objective-C -오브젝티브-C 의 Reference cout 아키텍처의 기능 중 하나는 오토릴리스 풀이다.객체를 릴리스한다는 것은 release 를 호출하여 객체의 리테인 수를 즉시 줄이거나 autorelease 를 호출해 객체를 오토릴리스 풀에 추가하는 것을 말한다.오토릴리스 풀은 미래의 특정 시점에 릴리스해야 할 객체의 집합으로 사용된다.풀이 마르면, 그 때 풀의 모든 객체에 release 메시지를 보낸다.@autoreleasepool { // ...} -객체에 autorelease 메시지를 보냈을 때 적절한 오토릴리스 풀이 없다면 콘솔(console)에서 다음과 .. 2017. 9. 28.
[Effective Objective-C] #33 weak 참조를 사용하여 리테인 순환을 피하라 [Effective Objective-C] #33 weak 참조를 사용하여 리테인 순환을 피하라 출처 : Effective Objective-C -객체들끼리 서로를 어떠한 방법으로 참조하여 순환을 이루고 있는 객체 그래프(object graph)에서 순환이 발생하는 것을 흔히 볼 수 있다.순환이 발생하면 특정 지점에서 메모리 누수가 발생할 것이다.순환을 이루는 모든 객체가 결국엔 순환 밖에 있는 객체들에 의해 참조되지 않기 때문이다.그렇게 되면 순환 내의 객체에 접근할 수 있는 방법이 더는 없게 된다.그뿐 아니라 순환 내의 객체들은 서로를 할당 해제하지 않을 것이다.서로가 서로를 살아 있게 유지하기 때문이다. -리테인 순환 중 가장 간단한 것은 객체 두 개가 서로를 참조하는 것이다. -리테인 순환 내의 .. 2017. 9. 27.
[Kotlin] Kotlin 은 Compile time 이 느리다는데.. 사실일까? [Kotlin] Kotlin 은 Compile time 이 느리다는데.. 사실일까? https://medium.com/keepsafe-engineering/kotlin-vs-java-compilation-speed-e6c174b39b5d -위 글을 쓴 필자는 Java base 로 되어 있는 출시된 앱을 전부 Kotlin 으로 전환하여 자신만의 Compile time 을 측정해보았다. -테스트 환경 및 조건 #1 빌드는 총 10번 연속으로 돌려서 평균값 산출Hardware 는 i7-6000 3.4GHz, 32G DDR4, Samsung 850 Pro SSD, Gradle 2.14.1 빌드시마다 매번 clean build or notGradle daemon 사용 or not코드 변경 유무 -Clean bui.. 2017. 9. 26.
반응형