[펌] iPhone 어플리케이션의 실행 구조

[출처: http://maclove.pe.kr/25]

어플리케이션이 처음 실행되고 부터 종료될 때 까지의 흐름을 살펴보도록 하겠다. 맥이나 윈도우 모두 그래픽 기반의 운영체제이다. 그래픽 기반의 운영체제에서 어플리케이션을 구현시키는 가장 좋은 방식은 이벤트 드리븐(Event driven)이다. 이벤트는 사용자가 마우스나 키보드를 누르는 것부터 특정 시간이 지났다는 이벤트, 네트워크로 데이터를 받았다는 이벤트 등등 모든 것이 해당할 수 있다. 놀랍게도 세계에서 가장 발전한 상용 GUI OS들인 맥 OS , MS의 윈도우즈 들의 아름다운 UI 밑에는 가장 기본적인 뼈대 Main Loop이 버티고 있다. 사실 컴퓨터 소프트웨어가 하는 일은 최초의 컴퓨터가 발명된 때와 별반 다르지 않다. 그 위에 수만 겹의 추상화가 지금의 컴퓨팅 환경을 만들어 놓았지만, 그 뼈대는 변하지 않은 것이다. 컴퓨터는 여전히 0 과 1밖에 모르는 바보다. 크게 어렵지 않으니 하나하나 익혀나가면서 정복해 보자.

* 처음 시작

사용자가 스프링 보드에 있는 어플리케이션의 아이콘을 누르면 어플리케이션이 실행된다. 다음 코드를 보자.

1.int main(int argc, char *argv[]) {
2.     
3.    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
4.    int retVal = UIApplicationMain(argc, argv, nil, nil);
5.    [pool release];
6.    return retVal;
7.}



Xcode 에서 자동으로 생성해 주는 코드이다. 기존의 C 함수와 마찬가지로 아이폰OS 에서 실행되는 프로그램들도 시작점은 메인 함수 이다. 메인 함수는 가장 먼저 자동해제 풀을 하나 할당한다. 자동해제 풀이란 메모리를 자동 릴리즈 하겠다고 설정한 객체들을 임시로 보관해 두었다가 적절한 시점에 해제시키기 위한 저장공간 정도로 이해하고 넘어가자.

다음 코드는 UIApplicationMain 함수를 실행시킨다. 이 함수는 argc, argv 이외에 두 개의 중요한 인자를 받는다. 첫번째로 UIApplication 클래스의 이름을 전달받는다. nil 을 입력하는 경우는 기본값인 UIApplication이 사용된다. 만약 UIApplication 을 상속받아서 새로운 클래스를 만들었다면 그 이름을 넣어주도록 하자.  두번째는 어플리케이션 델리게이트의 이름을 입력하며, nil 일 경우 info.plist 에 정의된 NSMainNibFile이 가리키는 nib파일에 설정되어 있는 델리게이트를 이용한다. 




<그림> 어플리케이션 흐름

그림을 통해서 흐름을 이해하도록 하자. 최초 main 이 호출되고 UIApplictionMain 이라는 함수 안에서 UIApplication 클래스가 하나 만들어 진다. 이 클래스는 UIKit8 에서 미리 구현해 놓은 것으로 어플리케이션 자체를 의미하는 클래스이며 한 어플리케션에 오직 하나의 UIApplication 클래스를 가지고 있다. pInfo.list 에서 UIApplication이 사용할 메인 nib 파일을 지정했다면(NSMainNibFile) 이 nib 파일을 읽어들인다. UIKit 프레임 워크는 이 파일을 분석해서 내부에 포함되어있는 객체들을 생성하고 초기화 시킨다. 보통 UIWindow 객체와 UIView 객체 등이 생성될 것이다. 그리고 인터페이스 빌더에서 설정했던 델리게이트나 객체 간의 연결도 설정한다. 이 작업이 완료되면 연결된 델리게이트의 applicationDidFinishLaunching 이 불려진다. 만약 nib 파일이 없는 경우 즉 NSMainNibFile을 설정하지 않은 경우에는 델리게이트의 applicationDidFinishLaunching 가 호출될 때 화면에 보여줄 객체들을 수동으로 만들어 줘야 한다.

그 이후 부터 UIApplication 에서는 이벤트를 처리하기 위한 메인 루프가 실행된다. 사용자가 홈 버튼을 누르거나, 전화를 받는 등의 이벤트에 의해서 어플리케이션이 종료된다. 이 때는 applicationWillTerminate 메시지가 불려지고, 이곳에서 어플리케이션의 상태를 저장하는 등의 작업을 해야 한다.

UIApplicationDelegate 는 지금 설명한 것 외에도 중요한 이벤트가 발생한 경우 그에 맞는 처리를 할 수 있는 다음 메서드들도 있다.

applicationDidReceiveMemoryWarning
메모리 부족 경고를 받은 경우. 현재 사용중인 메모리를 최대한 해제해야 한다.
applicationWillResignActive
어플리케이션이 실행중일 때 전화가 오면, 전화를 받을 것인지 무시할 지를 선택할 수 있다. 그 전에 이 메서드가 호출될 것이다. 또한 화면 잠금 버튼을 누른 경우에도 호출된다.
applicationDidBecomeActive
사용자가 전화나, 문자 등을 무시하는 버튼을 선택할 경우 다시 어플리케이션이 활성화 된 것을 알 수 있다. 처음 실행될 때 applicationDidFinishLaunching 메시지가 보내진 이 후에도 호출되고, 잠금 상태에서 다시 해제된 경우도 호출된다.
application:didFinishLaunchingWithOptions
아이폰 OS 3.0에 추가된 것으로 URL 이나 원격 통보(Remote notification) 에 의해서 어플리케이션이 실행된 경우를 처리할 수 있다.
application:didReceiveRemoteNotification
역시 3.0에 추가된 것으로 프로그램이 실행중에 원격 통보(Remote notification)을 받은 경우 필요한 처리를 할 수있다.

[출처: http://maclove.pe.kr/25]





출처 : http://blog.naver.com/PostView.nhn?blogId=baek2187&logNo=150059859922
Posted by 오늘마감

댓글을 달아 주세요