UIApplication 클래스 UIApplicationDelegate 프로토콜 순천향대학교 컴퓨터공학과 이 상 정 1 UIApplication 클래스 순천향대학교 컴퓨터공학과 이 상 정 2
UIApplication 클래스 개요 이 장에서는 UIApplication 클래스를 기본으로 하여 아이폰 프 로그램 동작 과정을 이해 인터페이스 빌더를 사용하지 않는 아이폰 템플릿인 Window-based Application 으로 UIApplication 클래스 아이폰 애플리케이션의 시작점 main.m 의 UIApplicationMain() 메서드에서 오브젝트 인스턴스 생성 UIApplicationDelegate 프로토콜을 사용하여 동작 제어 윈도우(UIWindow)를 초기화하고 디스플레이 뷰(UIView)를 윈도우에적재 애플리케이션의 라이프 사이클(life cycle) UIApplication에서 수신한 시스템 이벤트 처리 MainWindow.xib 파일에서 UIWindow, UIApplication, UIApplicationDelagate 연결 순천향대학교 컴퓨터공학과 이 상 정 3 Window-based Application 템플릿 Window-based d Application 템플릿으로 프로그래밍 작성 과정 1. 템플릿이 UIApplicationDelegate 자동 생성 2. 뷰(UIView, UIViewController)를 생성 3. 뷰에 그래픽 컨트롤러(오브젝트)를 추가 4. 오브젝트의 이벤트와 동작을 추가 5. UIApplicationDelegate 프로토콜의 시스템 이벤트 처리 동작 추가 6. 빌드하고 실행 순천향대학교 컴퓨터공학과 이 상 정 4
AddViewProject 예제 (1) Window-based Application 템플릿에서 뷰를 추가하는 예 뷰 컨트롤러 생성(xib, 클래스) 뷰의 속성을 변경 뷰를 적재하는 Delegate를 수정 1. New Project 창에서 Window-based d Application 선택하고 프로젝트 이름을 AddViewProject 로지정 2. Groups & Files Classes 폴더를 열고 UIApplicationDelegate 프로토콜을 따르는 클래스가 있는 AddViewProjectDelegate.h, elegate.h, AddViewProjectDelegate.m elegate.m 파일을 확인 순천향대학교 컴퓨터공학과 이 상 정 5 AddViewProject 예제 (2) 3. Resources 폴더를 선택하고 마우스 오른쪽 버튼 클릭 후 [Add]-[New File] 선택, User Interface 선택, Empty XIB 선택, Next 클릭하고 FirstViewController 로 xib 이름 지정 후 Finish 클릭 순천향대학교 컴퓨터공학과 이 상 정 6
AddViewProject 예제 (3) 4. Groups & Files 에서 Classes 클릭 후 메뉴에서 [File]- [New File] 선택하고, Cocoa Touch Class 템플릿 선택, UIViewController subclass 선택, Next 클릭 후 파일 이름으 로 FirstViewController.m 지정하고 Finish 클릭 (단, Also Create FisrtViewController.h 는 체크상태 유지) 순천향대학교 컴퓨터공학과 이 상 정 7 AddViewProject 예제 (4) 5. FirstViewController.xib 를 더블클릭하여 인터페이스 빌더 실행 6. 라이브러리 창에서 뷰를 선택하고, 뷰를 FirstViewController.xib의 도큐먼트 창으로 드래그 순천향대학교 컴퓨터공학과 이 상 정 8
AddViewProject 예제 (5) 7. 도큐먼트 창에서 File s Owner를 선택하고 인스펙터 창의 Identity 탭에서 Class Identity의 클래스를 FirstViewController로 선택 순천향대학교 컴퓨터공학과 이 상 정 9 AddViewProject 예제 (6) 8. 인스펙터 창의 Connections 탭에서 view outlet을 방금 생 성한 뷰에 연결 순천향대학교 컴퓨터공학과 이 상 정 10
AddViewProject 예제 (7) 9. 도큐먼트 창에 서뷰를선택하 고 인스펙터 창 의 속성 탭 (Attributes)에 서 View 부분의 Background 색 을클릭하여뷰 의색을변경 순천향대학교 컴퓨터공학과 이 상 정 11 AddViewProject 예제 (8) 10. FirstViewController.xib 를 저장하고 인터페이스 빌더를 종료 11. AddViewProjectDelegate.h 파일을 열고 FirstViewController.h를 import하고, FirstViewController 클래스를 참조하는 프로퍼티를 생성 #import <UIKit/UIKit.h> #import "FirstViewController.h"; @interface AddViewProjectAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; FirstViewController *first; @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) FirstViewController *first; @end 순천향대학교 컴퓨터공학과 이 상 정 12
AddViewProject 예제 (9) 12. AddViewProjectAppDelegate.m 파일을 열고 first 오브젝 트를 synthesize하고 DidFinishLaunching 메서드를 수정 #import "AddViewProjectAppDelegate.h" @implementation AddViewProjectAppDelegate @synthesize window; @synthesize first; - (void)applicationdidfinishlaunching:(uiapplication *)application { // (BOOL)application:(UIApplication *)application didfinishlaunchingwithoptions: // (NSDictionary *)launchoptions { first = [[FirstViewController alloc] initwithnibname:@"firstviewcontroller" bundle:nil]; [window addsubview: [first view]]; [window makekeyandvisible]; // return YES -(void)dealloc{ [window release]; [first release]; [super dealloc]; @end 순천향대학교 컴퓨터공학과 이 상 정 13 AddViewProject 예제 (6) 13. Build And Run 클릭하여 실행하고 색이 있는 뷰의 표시를 확인 순천향대학교 컴퓨터공학과 이 상 정 14
MainWindow.xib MainWindow.xib 기능 UIWindow를 생성(alloc), 초기화(init), 해제(dealloc) UIWindow, UIApplication, UIApplicationDelagate 연결 UIApplication이 MainWindow.xib를 적재 AddViewProjectAppDelegate 를 UIApplication 델리게이트(delegate)로 설정 델리게이트는 클래스의 처리과정을 분리하여 단순화 UIApplication은 이벤트 처리를 UIApplicationDelegate의 구현한 메서드를 참조하여 처리 순천향대학교 컴퓨터공학과 이 상 정 15 UIApplicationDelegate 프로토콜 순천향대학교 컴퓨터공학과 이 상 정 16
main.m UIApplicationMain 메서드 UIApplication 인스턴스 생성 UIApplication, UIApplicationDelegate 레퍼런스(포인터) 획득 UIApplication *myapplication = [UIApplication sharedapplication]; UIApplicationDelegate *mydelegate = [[UIApplication sharedapplication] ]delegate]; #import <UIKit/UIKit.h> int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retval = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retval; 순천향대학교 컴퓨터공학과 이 상 정 17 애플리케이션 라이프 사이클 아이폰 애플리케이션 실행 라이프 사이클(life cycle) UIKit 프레임워크를 기반으 로 애플리케이션을 실행하 고종료 UIApplicationMain() 함수에 서 애플리케이션 적재 이벤트 루프에서 이벤트를 수신하고, 사용자는 이벤트 를 처리하는 함수를 호출하 는 실행이 반복 순천향대학교 컴퓨터공학과 이 상 정 18
라이프 사이클 이벤트 (1) UIApplication이 라이프 사이클 이벤트 수신 애플리케이션 실행 동안의 주요 변화 시 이벤트 발생 이벤트가 발생하면 해당 메서드를 실행 처리(인터럽트) 라이프 사이클 이벤트를 처리하는 코드는 UIApplicationDelegate 프로토콜에 맞추어 작성 라이프 사이클 이벤트를 처리하는 메서드 정의 템플릿이 UIApplicationDelegate 프로토콜을 따르는 클래스 생성 AddViewProjectAppDelegate.h, AddViewProjectAppDelegate.m AddViewProjectAppDelegate 클래스는 UIApplicationDelegate 프로토 콜채택 @interface AddViewProjectAppDelegate: NSObject <UIApplicationDelegate> 순천향대학교 컴퓨터공학과 이 상 정 19 라이프 사이클 이벤트 (2) UIApplicationDelegate 이벤트 처리 메서드 application:didchangestatusbarframe: application:didchangestatusbarorientation: application:handleopenurl: application:willchangestatusbarframe: application:willchangestatusbarorientation: duration: applicationdidbecomeactive: applicationdidfinishlaunching: application:didfinishlaunchingwithoptions: 순천향대학교 컴퓨터공학과 이 상 정 20 메서드 형식 - (void) application: (UIApplication *) application didchangestatusbarframe: (CGRect) oldstatusbarframe - (void) application: (UIApplication *) application didchangestatusbarorientation: (UIInterfaceOrientation) oldstatusbarorientation - (void) application: (UIApplication *) application handleopenurl: (NSURL *) url - (void) application: (UIApplication *) application willchangestatusbarframe: (CGRect) newstatusbarframe - (void) application: (UIApplication *) application willchangestatusbarorientation: (UIInterfaceOrientation) newstatusbarorientation duration: (NSTimeInterval) duration - (void) applicationdidbecomeactive: (UIApplication *) application - (void) applicationdidfinishlaunching: (UIApplication *) application - (BOOL)application:(UIApplication *)application didfinishlaunchingwithoptions: (NSDictionary *)launchoptions {
라이프 사이클 이벤트 (3) UIApplicationDelegate 이벤트 처리 메서드 applicationdidreceivememorywarning: applicationsignificanttimechange: applicationwillresignactive: applicationwillterminate: 메서드 형식 - (void) applicationdidreceivememorywarning: (UIApplication *) application - (void) applicationsignificanttimechange: (UIApplication *) application - (void) applicationwillresignactive: (UIApplication *) application - (void) applicationwillterminate: (UIApplication *) application 순천향대학교 컴퓨터공학과 이 상 정 21 주요 라이프 사이클 이벤트 (1) 애플리케이션 시작 종료 이벤트 applicationdidfinishlaunching: 메서드 애플리케이션 시작 시 실행 처리 UIViewController와 UIWindow 초기화, UIView를 윈도우에 적재 애플리케이션 초기화 applicationwillterminate: 메서드 애플리케이션 종료 시 실행 처리 애플리케이션 상태 저장 및 정리(clean up) 순천향대학교 컴퓨터공학과 이 상 정 22
주요 라이프 사이클 이벤트 (2) 애플리케이션 비활성화 applicationwillresignactive: 메서드 애플리케이션을 비활성화 스크린 락 등 설정 시 애플리케이션 비활성화를 위해 실행 처리 applicationdidbecomeactive: 메서드 비활성화된 애플리케이션이 다시 활성화될 때 실행 처리 메모리 경고 applicationdidreceivememorywarning: 메서드 너무 많은 메모리 사용 시 경고를 위해 실행 처리 아이폰은 메모리 제한때문에 너무 많은 메모리를 사용하면 애플리케이션 을 강제 종료하는데, 종료 전에 보내는 이벤트에 응답하는 메서드 메모리를 확보를 위해 불필요한 메모리 해제 순천향대학교 컴퓨터공학과 이 상 정 23 인터럽트 처리 예 (1) 앞의 AddViewProjectAppDelegate 에 라이프 사이클 이벤트 처리 메서드 추가 applicationdidreceivememorywarning: applicationwillresignactive: applicationdidbecomeactive: 1. AddViewProjectAppDelegate의 implementation 부분 (AddViewProjectAppDelegate.m)에콘솔에출력하는라이 프 사이클 메서드를 추가 2. Build And Run 클릭하여 아이폰 시뮬레이터 실행 순천향대학교 컴퓨터공학과 이 상 정 24
인터럽트 처리 예 (2) #import "AddViewProjectAppDelegate.h @implementation AddViewProjectAppDelegate @synthesize window; @synthesize first; - (void)applicationdidfinishlaunching:(uiapplication *)application { first = [[FirstViewController alloc] initwithnibname:@"firstviewcontroller" bundle:nil]; [window addsubview: [first view]]; [window makekeyandvisible]; -(void)applicationwillresignactive:(uiapplication *) application { NSLog(@"hey I'm about to resign active status..."); -(void)applicationdidbecomeactive:(uiapplication *) application { NSLog(@"hey I'm active..."); -(void)applicationdidreceivememorywarning:(uiapplication *) application { NSLog(@"hey got a memory warning... "); 순천향대학교 컴퓨터공학과 이 상 정 25 인터럽트 처리 예 (3) 3. 아이폰 시뮬레이터 메뉴에서 [Hardware]-[Simulate [Simulate Memory Warning] 선택 4. 아이폰 시뮬레이터 메뉴에서 [Hardware]-[Lock] [Lock] 선택 후 아이폰 시뮬레이터를 unlock 하고 애플리케이션을 종료 5. 디버거 콘솔 창 출력을 확인 순천향대학교 컴퓨터공학과 이 상 정 26
[Hardware]-[Lock] [Lock] 선택 후 순천향대학교 컴퓨터공학과 이 상 정 27 Unlock 후 순천향대학교 컴퓨터공학과 이 상 정 28