UIApplicationDelegate分析小结
我们开发出来的运行在iOS平台上的应用程序都有一个UIApplication类的对象。
1、是iOS应用程序的起始点,并负责初始化和显示UIWindow;
2、负责加载应用程序的第一个UIView到UIWindow中;
3、帮助管理应用程序的生命周期;
4、接收事件,再转给它的委托"UIApplicationDelegate"来处理;此委托可处理的事件包括:应用程序的生命周期事件如程序启动和关闭、系统事件如来电和记事项警告;
?
(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1742950)
虽然UIApplication负责接收事件,但它无需我们来修改。而它的负责处理事件的委托类,其遵循UIApplicationDelegate协议,是需要我们进行开发。
例如
应用BirdsApp的委托类的声明如下:
@interface BirdsAppDelegate : UIResponder <UIApplicationDelegate>
这个类需要实现UIApplicationDelegate协议中的方法,用于处理UIApplication接收的事件。
这些方法有很多,大概是这些:
1、应用完成登录的事件处理方法;
2、应用中断的事件处理方法;
3、内存很低的事件处理方法;
4、重要改变发生的事件处理方法;
在开发时,我们需实现的最重要的方法是application:didFinishLaunchingWithOptions:,其他方法也应该去实现,虽然它们都是可选的。
在XCode4.5版中,如果使用它的模板创建项目,Xcode将会为我们创建遵守UIApplicationDelegate协议的方法,这些方法的实现代码需要我们自己去开发。
例如,创建一个名称为BirdsApp的项目,XCode会自动创建BirdsAppDelegate.h和BirdsAppDelegate.m文件。
/*BirdsAppDelegate 应用委托类*/#import <UIKit/UIKit.h>@class BirdSightingDataController;@class BirdsMasterViewController;@interface BirdsAppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;@property (strong, nonatomic) BirdSightingDataController *dataController;@property (strong, nonatomic) BirdsMasterViewController *firstViewController;@end#import "BirdsAppDelegate.h"#import "BirdSightingDataController.h"#import "BirdsMasterViewController.h"@implementation BirdsAppDelegate@synthesize window = _window, dataController = _dataController, firstViewController= _firstViewController;- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;BirdsMasterViewController *firstViewController = (BirdsMasterViewController *)[[navigationController viewControllers] objectAtIndex:0];BirdSightingDataController *aDataController = [[BirdSightingDataController alloc] init];firstViewController.dataController = aDataController;self.dataController = aDataController;return YES;}@end
?
建立在storyboard基础上的应用程序,作为UIApplication类的对象,在启动过程中将进行下列操作。
首先,加载info.plist文件内容到一个NSDictionary对象中,读取字典对象的键UIMainStoryboardFile对应的值得到storyboard配置文件名称,通常文件名称会是MainStoryboard.storyboard。
其次,加载MainStoryboard.storyboard文件,根据文件中记录的第一个视图控制器的值,自动实例化该控制器。该控制器称为主视图控制器。
再次,将主视图控制器的所有的视图使用addSubView方法加载到UIWindow对象中去。
这个时间点,算是完成应用启动,调用应用委托类中的application:didFinishLaunchingWithOptions:的方法。
而以前的应用程序用Interface Builder开发,使用nib管理视图,那么必须在应用委托类中实现加载主视图控制器的所有视图和实例化UIWindow对象的操作。
#import <UIKit/UIKit.h>@interface GuessChildAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; UINavigationController* simple_;}@property (nonatomic, retain) UIWindow *window;@end#import "GuessChildAppDelegate.h"#import "WifeBirthdayController.h"@implementation GuessChildAppDelegate@synthesize window;#pragma mark -#pragma mark Application lifecycle-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //CGRect frame = [[UIScreen mainScreen] bounds]; window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; WifeBirthdayController* rootViewController = [[[WifeBirthdayController alloc] init] autorelease]; simple_ = [[UINavigationController alloc] initWithRootViewController:rootViewController]; [window addSubview:simple_.view]; // Override point for customization after application launch. [window makeKeyAndVisible]; return YES;}-(void)dealloc { [window release]; [super dealloc];}@end
?
本想记录下应用委托类的用法,结果复习了一下应用程序的启动过程。
附一份社会热点评论短文。
?
《史记. 切糕传》: 贩切糕者, 多为西域人也。富可敌国。其业暴利,因有民曰:「一两五十,一刀三斤。」更有甚者曰:「一刀杨幂上床, 两刀帝都买房,三刀兰博到手,四刀盖茨认娘」。 故欧美人遇奢侈且无力购买之物时大多惊呼:「哦,卖糕的!」