1. main()
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
-UIApplicationMain 함수
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 하위클래스로 지정했을때, 하위클래스 델리게이트를 지정할 필요가 있다.(이부분은 잘모름;;; ㅠㅠ)
응용프로그램 델리게이트 객체는 몇가지 중요한 시스템 메세지를 다루는 책임을 가지며 모든 iOS 응용프로그램에서 반드시 존재해야 한다. 그 객체는 UIApplicationDelegate 프로토콜을 채용한 어떤 클래스의 인스턴스도 될 수 있다. 이 프로토콜의 메소드들은 응용프로그램 생명 주기 안에 훅들을 정의하고 커스텀 동작 구현을 맘대로 할 수 있다.
SDK 3.x 버전의 주요 델리게이트 메소드
- applicationDidFinishLaunching : 메소드
애플리케이션 객체의 생성이 끝난 후 가장먼저 불리는 메소드이다. 애플리케이션을 실행한 상태에서 기본적인 윈도우를 생성하고, 윈도우의 내용을 채우고, 이 윈도우가 애플리케이션의 기본 리스폰더의 역할을 하게 설정하는 위치이다.
- applicationWillTerminate : 메소드
applicationWillTerminate : 메소드에서는 스프링보드로 제어권을 넘기기 전에 어플리케이션의 상태를 마무리하는 모든 처리를 할 수 있다. 이 메소드를 사용해 기본값을 저장하거나, 데이터를 갱신하거나, 파일을 닫아야 한다.
- applicationDidReceiveMemoryWarning : 메소드
이 메소드가 호출되면 어플리케이션은 해체 가능한 모든 메모리를 해체해야 한다. 이 메소드는 UIViewController의 didReceiveMemoryWarning : 메소드와 밀접한 관계가 있다. 어플리케이션이 충분한 메모리를 확보 할 수 없는 상황이라면 아이폰은 어플리케이션을 종료시켜 버릴 것이며, 사용자는 다시 스프링보드로 돌아갈 것이다. 스프링보드는 어플리케이션의 어이콘을 표시하고, 사용자가 프로그램을 실행할 수 있게 해주는 아이폰의 매인 GUI다. 어플리케이션 딜리게이트는 사용자가 화면은 잠글 때 처럼 어플리케이션을 일시정지 하거나 시작할 때 필요한 처리를 해야 할 책임이 있다.
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을 상속한 클래스로 넘어간다. 어플리케이션이 종료되거나 메모리 문제가 발생할때 딜리게이트는 권한을 다시 받는다.
(* 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/ 에이콘 /에리카 세든 지음 참조.
'iPhone' 카테고리의 다른 글
타겟 액션 (Target - Action) (0) | 2011.09.19 |
---|---|
TextField 사용 후 iPhone 키패드 내리기 (0) | 2011.09.16 |
iPhon(아이폰) 데이타 전송 (뷰간의 데이터 전달 :직접전달, 델리게이트(Delegate), 노티피케이션, UserDefaults) (3) | 2011.09.14 |
아이폰의 모델 뷰 컨트롤러 (MVC) (0) | 2011.08.30 |
아이폰 윈도우와 뷰 뷰컨트롤러 (0) | 2011.08.30 |