본문 바로가기

iPhone

아이폰 어플리케이션 기본구성 요소




1. main() 

int main(int argc, char *argv[])

{

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    int retVal = UIApplicationMain(argc, argv, nil, nil);

    [pool release];

    return retVal;

}
 


- 어플리케이션이 사용한 오토릴리즈 풀(autorelease pool)을 생성
*오토릴리즈 풀(autorelease pool) 
아이폰의 메모리 관리 시스템을 지원하는객체이며, 레퍼런스 카운터를 바탕으로 메모리를 관리한다. 여기서 레퍼런스 카운터란 할당한 메모리를 참조하는 객체의 수를 말하며, 보통의 객체의 해제는 개발자의 책임이지만 이 책임을 대신하기 위한 것이 오토릴리즈 풀이다.
 
- 어플리케이션의 이벤트 루프를 실행

-UIApplicationMain 함수

int UIApplicationMain ( int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName );


  UIApplicationMain 함수는 어플리케이션의 새로운 객체를 생성하는 함수이다. (실제적인 초기화를 담당한다.) 함수 반환형은 int지만 리턴값은 돌려주지 않는다. 새로운 어플리케이션의 인스턴스와 델리게이트를 생성한다. UIApplicationMain 함수의 첫 번째는 argv인수의 항목 수를 지정하며 main()으로부터 상속받는다. 두 번째는 인수의 베열을 지정하며, 세 번째, 네 번째 인수는 어플리케이션 클래스와델리게이트의 이름은 명시해야 하는데, 세번째 인수를 생략한다면(nil선언) 기본 UIApplication클레스를  기본 어플리케이션 클레스로 사용한다. (기본적으로 3,4번은 nil로 기본지정 되어있다.) 사용자가 홈버튼을 누를때 인자값0과 종료함수를 불러 어플리케이션을 종료한다. 


* 정리
1. argc  - argv인수의 항목수를 지정 (main()으로부터 상속받는다.)
2.*argv[] - 인수 배열을 지정한다. (main()으로부터 상속받는다.)
3. * principalClassName - UIApplication클래스 또는 하위 클래스의 이름을 지정한다. (nil이 기본적으로 선언되며 이때에는 UIApplication클래스를 기본 어플리케이션 클래스로 사용한다.)
4.  *delegateClassName  - 어플리케이션의 델리게이트를 인스턴스화하는 클래스명을 지정한다. (nil이 기본적으로 선택되며, 이 때에 어플리케이션의 메인 nib파일로부터 델리게이트 객체를 읽어들인다.)
* principalClass로 
UIApplication 하위클래스로 지정했을때, 하위클래스 델리게이트를 지정할 필요가 있다.(이부분은 잘모름;;; ㅠㅠ)

2. 어플리케이션 델리게이트
- 어플리케이션 델리게이트는 어플리케이션이 실행 도중에 벌어지는 중요한 상황에 대한 대응을 구현한다. 델리게이트는 어플리케이션이 시작할때 윈도우시스템을 초기화시키며, 종료할 때 작업을 마무리시키는 역할을 하고, 메모리 경고를 처리하는 데 중요한 역할을 한다. 

응용프로그램 델리게이트 객체는 몇가지 중요한 시스템 메세지를 다루는 책임을 가지며 모든 iOS 응용프로그램에서 반드시 존재해야 한다. 그 객체는 UIApplicationDelegate 프로토콜을 채용한 어떤 클래스의 인스턴스도 될 수 있다. 이 프로토콜의 메소드들은 응용프로그램 생명 주기 안에 훅들을 정의하고 커스텀 동작 구현을 맘대로 할 수 있다.

SDK 3.x 버전의 주요 델리게이트 메소드

- applicationDidFinishLaunching : 메소드 

애플리케이션 객체의 생성이 끝난 후 가장먼저 불리는 메소드이다. 애플리케이션을 실행한 상태에서 기본적인 윈도우를 생성하고, 윈도우의 내용을 채우고, 이 윈도우가 애플리케이션의 기본 리스폰더의 역할을 하게 설정하는 위치이다.

- applicationWillTerminate : 메소드

applicationWillTerminate : 메소드에서는 스프링보드로 제어권을 넘기기 전에 어플리케이션의 상태를 마무리하는 모든 처리를 할 수 있다. 이 메소드를 사용해 기본값을 저장하거나, 데이터를 갱신하거나, 파일을 닫아야 한다.
 

- applicationDidReceiveMemoryWarning : 메소드 

이 메소드가 호출되면 어플리케이션은 해체 가능한 모든 메모리를 해체해야 한다. 이 메소드는 UIViewController의 didReceiveMemoryWarning : 메소드와 밀접한 관계가 있다. 어플리케이션이 충분한 메모리를 확보 할 수 없는 상황이라면 아이폰은 어플리케이션을 종료시켜 버릴 것이며, 사용자는 다시 스프링보드로 돌아갈 것이다. 스프링보드는 어플리케이션의 어이콘을 표시하고, 사용자가 프로그램을 실행할 수 있게 해주는 아이폰의 매인 GUI다. 어플리케이션 딜리게이트는 사용자가 화면은 잠글 때 처럼 어플리케이션을 일시정지 하거나 시작할 때 필요한 처리를 해야 할 책임이 있다. 



SDK 4.x 버전의 주요 델리게이트 메소드

3.x 버전에서는 - applicationDidFinishLaunching : 메소드를 사용 하였지만 4.x버전에서 부터는 application:didFinishLaunchingWithOptions : 메소드를 사용할것을 권장한다. 3.x버전에는 완벽하게 작동하지 않았지만 4.x 버전에서 부터는 제데로 동작하고 있으며 SDK 4.x에서 엑스코드로 템플릿을 생성시  applicationDidFinishLaunching가 아닌 application:didFinishLaunchingWithOptions:가 생성되는 것을 알 수 있다.

IOS 3.x버전에서는 서드파티 어플리케이션의 멀티태스킹이 불가능하였기 때문에 applicationWillTerminate메소드 하나만 처리하였지만 IOS 4.x부턴 멀티태스킹이 가능하기 때문에 멀티테스킹에 관한 델리게이트메소드도 처리해줘야 한다.
 applicationDidEnterBackground : 어플리케이션의 활동을 중단하고 백그라운드로 돌아갈 때 불리는 메소드이다. 중요한 상태정보는 여기에 저장해야 한다. 사용자나 시스템이 백그라운드 프로세스를 종료해버릴 수도 있다는점을 알아야 한다.
 applicationWillTerminate :  어플리케이션이 활동을 중단하고 백그라운드로 들어간 상태에서 단순히 일시정지가 아닌 종료할 때 불리는 메소드이다.
 applicationWillEnterForeground : 어플리케이션이 백그라운드에 있다가 다시 전면으로 나올 때 불리는 메소드이다. 이 메소드가 불리는 시점에서는 어플리케이션이 아직 실행을 재개한 상태가 아니다. 백그라운드로 돌면서 바뀐 내용을 화면에 반영하려면 이 메소드에서 처리해 주어야 한다.
 applicationDidBecomeActive : 어플리케이션이 실행을 재개할 때 불리는 메소드이다.   


어플리케이션 델리게이트의 권한은 어플리케이션을 시작하고 윈도우를 로드하게 되면 권한은 UIViewController을 상속한 클래스로 넘어간다. 어플리케이션이 종료되거나 메모리 문제가 발생할때 딜리게이트는 권한을 다시 받는다.

 
3. 뷰 컨트롤러
어플리케이션 실행 방식의 핵심이며, 보통 사용자의 선택이나 버튼터치, 센서 입력에 관한 어플리케이션 대응방법을 구현한다. 인터페이스빌더를 사용하여 GUI를 미리 만들어놓지 않았다면 뷰컨트롤러에서 뷰를 로드하여 구성해야 한다. main.m과 델리게이트 파일은 크기가 작지만 어플리케이션의 리소스 사용방법과 사용자 응답방식을 모두 정의하는 뷰 컨트롤러의 소스는 규모가 크다.
(* UIView 인스턴스만이 터치입력을 직접 받을 수 있으며 UIViewController 객체는 터치 입력을 받을 수 없다.)

핵심 메소드

loadView 매소드, viewDidLoad 메소드

XIB파일을 사용하여 구성하지 않았을때 loadView 메소드에서 화면을 설정하고 모든 하위 뷰를 구성해야 한다. UITableViewController이나 UITabBarController 같은 특별한 하위클래스를 상속했다면 반드시 [super loadView]호출하거나 viewDidLoad를 구현해야 한다. 이렇게 해야 별도의 설정을 추가하기 전에 부모 클래스가 화면을 올바르게 설정할 수 있다.
 

shouldAutorotateToInterfaceOrientation : 메소드

강제로 세로보기 모드를 유지해야만 할 특별한 이유가 없다면 UIViewController가 아이폰의 방향에 따라 자동으로 화면을 맞출 수 있게 shouldAutorotateToInterfaceOrientation :를 추가해야 한다. 
 

viewWillAppear : 메소드와 viewDidAppear : 메소드 

화면에 표시할 준비가 끝나거나 뷰를 화면에 완전히 표시했을 때 호출되는 메소드이다. viewWillAppear :는 표시하려는 뷰에서 사용할 정보를 업데이트 해야한다. 이 메소드가 호출되는 시점에서 아직 뷰의 로드는 끝나지 않았으며 하위 뷰에 연결한 IBOutlet을 사용하려면 self.view로 뷰게층을 로드해야 한다. viewDidAppear:은 애니메이션과 같은 화면 동작을 설정한다.

 

출처:The Core Application Design (2)
         
The iPhone Developer's cookbook/ 에이콘 /에리카 세든 지음 참조.