NSTimer 백그라운드 진입시 동작 분석

iOS에서 특정 시간주기로 특정 메서드을 호출하기위해 NSTimer를 사용하게 된다. 이때 앱이 백그라운드(background)로 진입할때, 그리고 잠시 후 다시 포어그라운드(foreground)로 돌아올경우 예약되어 사용중인 NSTimer가 어떻게 동작하는지 살펴보도록 하자. 기본적으로 타이머의 실행 주기는 타이머가 등록되는 시간을 기준으로하여 **고정 간격으로 실행(fire)**된다. 이는 앱이 백그라운드로 진입하면서 잠시 타이머가 정지한다 해도 영향을 받지않고 동일하게 적용된다. 백그라운드 진입시 NSTimer는 언제 정지하는가? 앱이 백그라운드로 진입하면서 AppDelegate의 applicationDidEnterBackground:가 호출될 때, 특별히 명시적으로 backgroundTask를 등록하지 않은경우에는 백그라운드 진입과 동시에 타이머는 정지하게된다. ...

2014년 4월 24일 · 2분 · 226단어

GCD 튜토리얼

지난 포스트에서 블록(block)의 동작에 대해서 분석해보았는데, 이런 블록들을 이용하여 멀티스레드 프로그래밍을 손쉽게 할 수 있는 방법을 제공하는 GCD (Grand Central Dispatch) 에대해 알아보도록 하자. 본 포스트의 내용은 1 의 내용을 요약하면서 추가적으로 유용한 내용들을 GCD 애플 문서2에서 발췌하여 정리한 내용임을 밝힌다. 디스패치 큐의 종류 컨커런트 디스패치 큐 (concurrent dispatch queue) : 해당 큐 내의 작업들간에 실행 순서는 보장할 수 없다. dispatch_queue_t queue = dispatch_queue_create(“com.letmecompile.concurrentQueue”, DISPATCH_QUEUE_CONCURRENT); 시리얼 디스패치 큐 (serial dispatch queue): 해당 큐 내의 작업들은 큐에 추가된 순서로 하나씩 수행됨을 보장한다. 때문에 시리얼큐는 하나 생성될때마다 스레드가 하나 더 생기기때문에 과도하게 많은숫자를 하면 성능에 문제가 있을 수 있다. dispatch_queue_t queue = dispatch_queue_create(“com.letmecompile.serialQueue”, NULL); ...

2014년 3월 18일 · 4분 · 819단어

Xcode LLDB 디버깅 테크닉

Xcode에 기본으로 내장되어있는 디버거(debugger)인 LLDB는 기존에 가장 많이 사용되던 gdb보다 많은 유용한 기능들을 갖고있다. LLDB 명령어 분석기에는 파이썬(Python) 인터프리터가 내장되어있어서 script 명령어로 파이썬 코드들을 사용할 수 있다. 이 또한 반대로 모든 LLDB API들이 SB(Scripting Bridge) 를 통해서 Python에서도 사용이 가능하도록 되어있다.[^1] 이러한 파이썬과의 연계를 통해서 Xcode 디버깅을 진행 할때 더 세분화된 조건들을 정의하여 브레이크포인트(breakpoint)에 지정할 수 있게되었고, 이런 조건에따라 액션 수행, 브레이크포인트 무시/진행여부 결정 등의 다양한 동작이 가능하다[^2]. 본 글은 애플의 “Advance Debugging with LLDB (WWDC 2013, Session 413)” 발표자료[^3]를 토대로 요약 및 정리한 내용이다. ...

2014년 2월 28일 · 4분 · 665단어

KVO 컨텍스트 표현을 위한 자기참조 포인터

다음과같은 포인터변수에 자신의 변수명 그대로 자기자신의 주소값을 할당하는 특이한 변수선언을 처음 볼 경우 당황스러울 것이다. void *myVariableName = &myVariableName 하지만 이는 자기참조 포인터 혹은 유니크 컨텍스트 포인터(unique context pointer)라는 이름으로 불리는 엄연히 C/C++/Obj-C에서 유효한 문법이다. 이를 이용하여 컴파일타임에 유니크한 포인터값을 생성할 수 있어서 컨텍스트 구분을 위한 변수를 표현할때 매우 유용하게 사용될 수 있다. 해당 컨텍스트변수가 해당 파일 내에서만 사용할 경우. .m파일에 다음과같이 선언하면된다. static void *MyContext = &MyContext; 만약 다른 파일에서도 사용되는 컨텍스트라면, ...

2014년 2월 20일 · 2분 · 229단어

Objective-C Block 동작 심층 분석

블락은 애플에서 closure 개념을 도입하기위해 ANSI C 에 익스텐션 형태로 만들어진 문법이다. 따라서 C/C++/Objective-C에서 모두 사용이 가능하지만 사용법과 메모리 관리에 있어서의 사용법은 언어특성에따라 조금씩 달라진다. 여기서는 Objective-C에서의 블락에 초점을 맞춰 분석을 할 예정이다. 블락(Block)의 실체 블락을 선언할 경우 실제로 컴파일러에의해 생성되는 코드에서는 __block_literal 이라는 구조체(struct) 형태로 선언이된다. 이 구조체 안에는 isa 정보가 포함되어있어서 결국 Objective-C의 객체의 특성을 가지게 된다.(심지어 블락이 C/C++에서 사용되더라도 동일하게 Objective-C의 객체특성을 가진다). Obj-C의 런타임에서 isa에관한 세부 내용은Objective-C 런타임 내부동작 분석 글에 자세히 설명되어있다. ...

2014년 2월 11일 · 4분 · 756단어

코어데이터(Core Data) 한줄로 데이터 불러오기

코어 데이터는 익숙해지면 매우 편리한 기능을 제공해주지만 한번 사용하려고 할 때 마다 셋업해줘야 할 것들이 매우 많아서 처음 접해보는 개발자들에게 문턱이 높은 편이다. 애플의 Core Data Programming Guide에서 데이터를 불러오기(fetch)위해 사용하는 코드는 다음과 같다. NSManagedObjectContext *moc = [self managedObjectContext]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc]; NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; [request setEntity:entityDescription]; // Set example predicate and sort orderings... NSNumber *minimumSalary = ...; NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(lastName LIKE[c] 'Worsley') AND (salary > %@)", minimumSalary]; [request setPredicate:predicate]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES]; [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release]; NSError *error = nil; NSArray *array = [moc executeFetchRequest:request error:&error]; if (array == nil) { // Deal with error... } 단순히 데이터를 불러오기 위해 13줄이나 코드를 쓰는 것은 고역이다. ...

2013년 8월 17일 · 2분 · 259단어

Objective-C 런타임(runtime) 내부 동작 분석

맥의 코코아(Cocoa)나 iOS의 코코아터치(CocoaTouch) 프레임워크를 다루다보면 Objective-C 런타임(runtime)과 항상 맞닥뜨리게 된다. 입문자들의 경우에는 프레임워크를 이용해서 잘 동작하는 Objective-C 코드를 작성하는데만 급급하지만, 해당 객체가 응답할 수 없는 잘못된 메시지를 보내서 런타임 에러가 나는 것 등의 여러가지 예외 상황을 겪게되면 점점 Objective-C 런타임이 어떻게 동작하는지 궁금해지게 된다. 필자도 이것이 궁금해져서 구글링을 하다가 설명이 잘되어있는 Colin Wheeler의 포스팅[^1]을 발견했다. 본 글의 내용들은 이 포스팅을 번역하여 작성되었고 내용상의 설명순서는 좀더 이해하기 쉽게 재배열 하였다. 부분적으로 추가 설명이 더 필요한 부문은 애플의 Objective-C Runtime Programming Guide[^2]도 참조했다. ...

2013년 8월 17일 · 9분 · 1898단어

코어데이터(Core Data)와 데이터베이스의 차이

애플의 Core Data Programming Guide 문서에는 코어데이터(Core Data)가 데이터베이스가 아니라고 명시되어있다. 하지만 코어데이터와 데이터베이스 둘다 검색가능하고, 영속적인 저장소를 제공하는 방법이므로 구체적으로 무엇이 다른지는 명확하지 않다. 이 포스트에서는 코어데이터가 동작하는 방법을 살펴보면서 왜 코어데이터가 일반적인 SQL 데이터베이스와 다른지 비교해 볼 것이다(코어데이터를 사용하더라도 실제 뒷단의 저장소는 SQL 데이터베이스가 사용되는 경우도 있다). 소개 코어데이터와 SQL 데이터베이스 모두 구조화된 데이터를 검색가능한 저장소에 저장하는 수단을 제공해준다. 일반적으로 개발자들이 데이터베이스에 익숙하고, 코어데이터가 실제로 뒷단에서 SQLite 데이터 베이스를 사용하여 데이터를 저장하는 경우도 있기 때문에 코어데이터가 마치 SQLite의 wrapper인 것처럼 생각되기 쉽다. ...

2013년 8월 14일 · 6분 · 1250단어

iOS, Mac 앱 개발시 하위 호환성 유지

맥OS에서 개발할때, 최신 버전의 SDK를 사용하면 최신 기능들을 이용해서 더 멋진 어플리케이션을 손쉽게 개발 할 수 있다. 하지만 결국 하위 호환성(backward compatibility)을 고려하지 않으면 이전 버전의 OS에서 제대로 작동하지 않는 사태가 종종 발생한다. 이러한 상황은 MacOS 뿐 아니라 iOS에서도 동일하게 적용된다. 현재 필자의 개발환경은 다음과 같다. MacOS 10.7 (Lion) XCode 4.6.2 with MacOS SDK 10.8 (Mountain Lion) 하지만 다음 링크에서 볼 수 있듯이 http://chitika.com/os-x-version-distribution 아직도 10.6(Snow leopard)가 점유율이 가장 높아서, 현재 개발중인 어플리케이션은 최소 스노우 레오파드를 타겟으로 개발을 하기로 마음을 먹었다. 이런 상황에서 호환성을 유지하려면 어떤 점들이 고려되어야 하는지 살펴보도록 하자. ...

2013년 7월 25일 · 3분 · 524단어