[轉]UIApplicationDelegate分析小結

轉載地址:http://www.apkbus.com/android-131646-1-1.htmlphp

咱們開發出來的運行在iOS平臺上的應用程序都有一個UIApplication類的對象。
一、是iOS應用程序的起始點,並負責初始化和顯示UIWindow;
二、負責加載應用程序的第一個UIView到UIWindow中;
三、幫助管理應用程序的生命週期;
四、接收事件,再轉給它的委託"UIApplicationDelegate"來處理;此委託可處理的事件包括:應用程序的生命週期事件如程序啓動和關閉、系統事件如來電和記事項警告;

雖然UIApplication負責接收事件,但它無需咱們來修改。而它的負責處理事件的委託類,其遵循UIApplicationDelegate協議,是須要咱們進行開發。

例如
應用BirdsApp的委託類的聲明以下:
@interface BirdsAppDelegate : UIResponder <UIApplicationDelegate>

這個類須要實現UIApplicationDelegate協議中的方法,用於處理UIApplication接收的事件。
這些方法有不少,大概是這些:
一、應用完成登陸的事件處理方法;
二、應用中斷的事件處理方法;
三、內存很低的事件處理方法;
四、重要改變發生的事件處理方法;

在開發時,咱們需實現的最重要的方法是application:didFinishLaunchingWithOptions:,其餘方法也應該去實現,雖然它們都是可選的。

在XCode4.5版中,若是使用它的模板建立項目,Xcode將會爲咱們建立遵照UIApplicationDelegate協議的方法,這些方法的實現代碼須要咱們本身去開發。

例如,建立一個名稱爲BirdsApp的項目,XCode會自動建立BirdsAppDelegate.h和BirdsAppDelegate.m文件。
  1. /*BirdsAppDelegate 應用委託類*/
  2. #import <UIKit/UIKit.h>
  3. [url=home.php?mod=space&uid=661]@class[/url] BirdSightingDataController;
  4. @class BirdsMasterViewController;
  5. @interface BirdsAppDelegate : UIResponder <UIApplicationDelegate>
  6. @property (strong, nonatomic) UIWindow *window;
  7. @property (strong, nonatomic) BirdSightingDataController *dataController;
  8. @property (strong, nonatomic) BirdsMasterViewController *firstViewController;
  9. @end
  10. #import "BirdsAppDelegate.h"
  11. #import "BirdSightingDataController.h"
  12. #import "BirdsMasterViewController.h"
  13. @implementation BirdsAppDelegate
  14. @synthesize window = _window, dataController = _dataController, firstViewController= _firstViewController;
  15. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  16. {
  17. UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
  18. BirdsMasterViewController *firstViewController = (BirdsMasterViewController *)[[navigationController viewControllers] objectAtIndex:0];
  19. BirdSightingDataController *aDataController = [[BirdSightingDataController alloc] init];
  20. firstViewController.dataController = aDataController;
  21. self.dataController = aDataController;
  22. return YES;
  23. }
  24. @end
複製代碼
創建在storyboard基礎上的應用程序,做爲UIApplication類的對象,在啓動過程當中將進行下列操做。

 

首先,加載info.plist文件內容到一個NSDictionary對象中,讀取字典對象的鍵UIMainStoryboardFile對應的值獲得storyboard配置文件名稱,一般文件名稱會是MainStoryboard.storyboard。

 

其次,加載MainStoryboard.storyboard文件,根據文件中記錄的第一個視圖控制器的值,自動實例化該控制器。該控制器稱爲主視圖控制器。

 

再次,將主視圖控制器的全部的視圖使用addSubView方法加載到UIWindow對象中去。



這個時間點,算是完成應用啓動,調用應用委託類中的application:didFinishLaunchingWithOptions:的方法。




而之前的應用程序用Interface Builder開發,使用nib管理視圖,那麼必須在應用委託類中實現加載主視圖控制器的全部視圖和實例化UIWindow對象的操做。
  1. #import <UIKit/UIKit.h>
  2. @interface GuessChildAppDelegate : NSObject <UIApplicationDelegate> {
  3. UIWindow *window;
  4. UINavigationController* simple_;
  5. }
  6. @property (nonatomic, retain) UIWindow *window;
  7. @end
  8. #import "GuessChildAppDelegate.h"
  9. #import "WifeBirthdayController.h"
  10. @implementation GuessChildAppDelegate
  11. @synthesize window;
  12. #pragma mark -
  13. #pragma mark Application lifecycle
  14. -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
  15. //CGRect frame = [[UIScreen mainScreen] bounds];
  16. window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  17. WifeBirthdayController* rootViewController = [[[WifeBirthdayController alloc] init] autorelease];
  18. simple_ = [[UINavigationController alloc] initWithRootViewController:rootViewController];
  19. [window addSubview:simple_.view];
  20. // Override point for customization after application launch.
  21. [window makeKeyAndVisible];
  22. return YES;
  23. }
  24. -(void)dealloc {
  25. [window release];
  26. [super dealloc];
  27. }
  28. @end
複製代碼
本想記錄下應用委託類的用法,結果複習了一下應用程序的啓動過程。
相關文章
相關標籤/搜索