因为接触ios不久,虽然项目能够作,可是对于UIApplication、AppDelegate这几个概念不是很熟悉,今天早上总结整理一下,找到一篇不错的博文,我就分享出来了。java
UIApplication、AppDelegate、委托等的关系?
什么是委托?为何要有委托?委托在Iphone中的实现机制是怎样的?
通常来讲,咱们建立了一个Iphone项目,默认会有这个main.m类,咱们都晓得,一个main()方法表明着一个应用程序的入口,
如下是对应的main.m的方法体:ios
int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
在上述的这个方法体中,UIApplicationMain()方法根据咱们提供的AppDelegate类名称来建立UIApplication的一个实例,且将这个
AppDelegate做为UIApplication的委托,通常咱们能够经过类方法[UIApplication shareApplication]来获取对UIApplication
的一个引用;
在UIApplication接收到系统事件和生命周期事件时,会把相应的事件传递给UIApplicationDelegate进行处理,下表所列的生命周期函数大都是可选的,
但为了应用程序的健壮性程序员应该实现它们。
一、- (void)applicationWillResignActive:(UIApplication *)application
说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,好比来电话了
二、- (void)applicationDidBecomeActive:(UIApplication *)application
说明:当应用程序入活动状态执行,这个恰好跟上面那个方法相反
三、- (void)applicationDidEnterBackground:(UIApplication *)application
说明:当程序被推送到后台的时候调用。因此要设置后台继续运行,则在这个函数里面设置便可
四、- (void)applicationWillEnterForeground:(UIApplication *)application
说明:当程序从后台将要从新回到前台时候调用,这个恰好跟上面的那个方法相反。
五、- (void)applicationWillTerminate:(UIApplication *)application
说明:当程序将要退出是被调用,一般是用来保存数据和一些退出前的清理工做。这个须要要设置UIApplicationExitsOnSuspend的键值。
六、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
说明:iPhone设备只有有限的内存,若是为应用程序分配了太多内存操做系统会终止应用程序的运行,在终止前会执行这个方法,一般能够在这里进行内存清理工做防止程序被终止
七、- (void)applicationSignificantTimeChange:(UIApplication*)application
说明:当系统时间发生改变时执行
八、- (void)applicationDidFinishLaunching:(UIApplication*)application
说明:当程序载入后执行
九、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
说明:当StatusBar框将要变化时执行
十、- (void)application:(UIApplication*)application willChangeStatusBarOrientation:
(UIInterfaceOrientation)newStatusBarOrientation
duration:(NSTimeInterval)duration
说明:当StatusBar框方向将要变化时执行
十一、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
说明:当经过url执行
十二、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
说明:当StatusBar框方向变化完成后执行
1三、- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
说明:当StatusBar框变化完成后执行
iPhone中的应用程序很容易受到打扰,好比一个来电可能致使应用程序失去焦点,若是这个时候接听了电话,那么应用程序会转到后台运行。
还有不少其它相似的事件会致使iPhone应用程序失去焦点,在应用程序失去焦点前会调用委托类的applicationWillResignActive()方法,
而应用程序再次获取到焦点的时候会调用applicationDidBecomeActive()方法。
好比在运行应用程序的时候锁屏会调用委托类的applicationWillResignActive()方法,而当屏幕被解锁的时候,又会调用applicationDidBecomeActive()方法。
另一个很是重要的方法就是applicationDidReceiveMemoryWarning(),由于iPhone设备只有有限的内存,若是为应用程序分配了太多内存操做系统会终止应用程序的运行,但在终止以前操做系统会经过先调用委托类的applicationDidReceiveMemoryWarning()方法警告应用程序,在UIApplication接收到这个事件后它会传递给委托类的applicationDidReceiveMemoryWarning()方法,委托类在这个方法内能够进行释放内存的操做以防止操做系统强制终止应用程序的运行。
下面是这个类的一些功能:
1.设置icon上的数字图标
//设置主界面icon上的数字图标,在2.0中引进, 缺省为0
[UIApplication sharedApplication].applicationIconBadgeNumber = 4;
2.设置摇动手势的时候,是否支持redo,undo操做
//摇动手势,是否支持redo undo操做。
//3.0之后引进,缺省YES
[UIApplication sharedApplication].applicationSupportsShakeToEdit =YES;
3.判断程序运行状态
//判断程序运行状态,在2.0之后引入程序员
/* UIApplicationStateActive, UIApplicationStateInactive, UIApplicationStateBackground */ if([UIApplication sharedApplication].applicationState ==UIApplicationStateInactive){ NSLog(@"程序在运行状态"); }
4.阻止屏幕变暗进入休眠状态
//阻止屏幕变暗,慎重使用,缺省为no 2.0
[UIApplicationsharedApplication].idleTimerDisabled =YES;
慎重使用本功能,由于很是耗电。
5.显示联网状态
//显示联网标记 2.0
[UIApplication sharedApplication].networkActivityIndicatorVisible =YES; 设计模式
6.在map上显示一个地址app
NSString* addressText =@"1 Infinite Loop, Cupertino, CA 95014"; // URL encode the spaces addressText = [addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; NSString* urlText = [NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@", addressText]; [[UIApplication sharedApplication]openURL:[NSURLURLWithString:urlText]];
7.发送电子邮件iphone
NSString *recipients =@"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!"; NSString *body =@"&body=It is raining in sunny California!"; NSString *email = [NSStringstringWithFormat:@"%@%@", recipients, body]; email = [emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [[UIApplication sharedApplication]openURL:[NSURLURLWithString:email]];
8.打电话到一个号码
// Call Google 411
[[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];
9.发送短信
// Text to Google SMS
[[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];
10.打开一个网址
// Lanuch any iPhone developers fav site
[[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];
UIApplication:通常是指运行中的应用程序,它的一个主要工做是处理用户事件,它会引发一个队列,全部的用户事件都放入到队列中,
逐个被处理掉,在处理的时候,它会发送事件到一个合适的处理事件的目标控件,此外,UIApplication还维护在本应用程序中打开的
Window列表(UIWindow实例),这样子它就能够接触应用程序中的任何一个UIView对象;
AppDelegate:负责为另一个对象处理特定事件的类,好比咱们load完一个页面的时候,委托就帮助UIApplication完成
didFinishLaunchingWithOptions动做,相应地在这个方法里面执行对应地action;
委托是给一个对象提供机会对另外一个对象中的变化做出反映或者影响另外一个对象的行为,一般包括3种动词:should、will、did
UIApplication委托AppDelegate,则AppDelegate必须得实现UIApplicationDelegate协议,这个协议咱们能够当成是java中的一个接口,
协议中定义了一系列方法,咱们必须在子类中将其实现,而后底层UIApplication会自动去调用咱们已经定义好的方法,这有点相似java中Ioc方向控制机制
固然,iphone中运用委托设计模式的地方不少,好比这个UIActionSheetDelegate、UIAlertViewDelegate协议,好比咱们要在本身的某个界面中展现
这个操做表(UIActionSheet),则咱们的视图控制器必需要实现这个UIActionSheetDelegate协议,重写其中的某些方法,也就是说,谁被委托了,
谁就要实现协议中定义的方法,确保正常的调用函数