UIApplication、AppDelegate、委托等的关系?  
什么是委托?为什么要有委托?委托在Iphone中的实现机制是怎样的?

一般来说,我们创建了一个Iphone项目,默认会有这个main.m类,我们都晓得,一个main()方法代表着一个应用程序的入口,  
以下是对应的main.m的方法体:

  1. int main(int argc, charchar *argv[])
  2. {
  3. @autoreleasepool {
  4. return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  5. }
  6. }

在上述的这个方法体中,UIApplicationMain()方法根据我们提供的AppDelegate类名称来创建UIApplication的一个实例,且将这个  
AppDelegate作为UIApplication的委托,一般我们可以通过类方法[UIApplication shareApplication]来获取对UIApplication 
的一个引用;

在UIApplication接收到系统事件和生命周期事件时,会把相应的事件传递给UIApplicationDelegate进行处理,下表所列的生命周期函数大都是可选的,  
但为了应用程序的健壮性程序员应该实现它们。  
1、- (void)applicationWillResignActive:(UIApplication *)application  
说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了

2、- (void)applicationDidBecomeActive:(UIApplication *)application  
说明:当应用程序入活动状态执行,这个刚好跟上面那个方法相反

3、- (void)applicationDidEnterBackground:(UIApplication *)application  
说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可

4、- (void)applicationWillEnterForeground:(UIApplication *)application  
说明:当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。

5、- (void)applicationWillTerminate:(UIApplication *)application  
说明:当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。

6、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application  
说明:iPhone设备只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,在终止前会执行这个方法,通常可以在这里进行内存清理工作防止程序被终止

7、- (void)applicationSignificantTimeChange:(UIApplication*)application  
说明:当系统时间发生改变时执行

8、- (void)applicationDidFinishLaunching:(UIApplication*)application  
说明:当程序载入后执行

9、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame  
说明:当StatusBar框将要变化时执行

10、- (void)application:(UIApplication*)application willChangeStatusBarOrientation:  
(UIInterfaceOrientation)newStatusBarOrientation  
duration:(NSTimeInterval)duration  
说明:当StatusBar框方向将要变化时执行

11、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url  
说明:当通过url执行

12、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation  
说明:当StatusBar框方向变化完成后执行

13、- (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以后引入

  1. /*
  2. UIApplicationStateActive,
  3. UIApplicationStateInactive,
  4. UIApplicationStateBackground
  5. */
  6. if([UIApplication sharedApplication].applicationState ==UIApplicationStateInactive){
  7. NSLog(@"程序在运行状态");
  8. }

4.阻止屏幕变暗进入休眠状态  
    //阻止屏幕变暗,慎重使用,缺省为no 2.0  
    [UIApplicationsharedApplication].idleTimerDisabled =YES;  
慎重使用本功能,因为非常耗电。  
5.显示联网状态  
    //显示联网标记 2.0  
    [UIApplication sharedApplication].networkActivityIndicatorVisible =YES;

6.在map上显示一个地址

  1. NSString* addressText =@"1 Infinite Loop, Cupertino, CA 95014";
  2. // URL encode the spaces
  3. addressText =  [addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
  4. NSString* urlText = [NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];
  5. [[UIApplication sharedApplication]openURL:[NSURLURLWithString:urlText]];

7.发送电子邮件

  1. NSString *recipients =@"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!";
  2. NSString *body =@"&body=It is raining in sunny California!";
  3. NSString *email = [NSStringstringWithFormat:@"%@%@", recipients, body];
  4. email = [emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  5. [[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协议,重写其中的某些方法,也就是说,谁被委托了,  
谁就要实现协议中定义的方法,确保正常的调用

最新文章

  1. monkeyrunner 自动化测试 图片对比的实现
  2. MFC 打开文件夹选择框并获取文件夹路径
  3. udhcpc命令【转】
  4. H5测试区别与PC端测试关注点
  5. NEFU 2016省赛演练一 B题(递推)
  6. Maven 建立web项目 The import javax.servlet cannot be resolved
  7. HDU 5762 Teacher Bo
  8. ie6/7/8中span右浮动折行问题的解决方案
  9. MD5Untils加密工具类
  10. Altium Design 中差分走线的设置
  11. ubuntu14.04中解压缩window中的zip文件,文件名乱码的解决方法
  12. Java线程(十):CAS
  13. Java JVM 内存泄漏--全解析和处理办法 [ 转载 ]
  14. 解决CenOS 7下启动ActiveMQ时报错
  15. CentOS环境下Docker私有仓库搭建
  16. spring cloud中feign的使用
  17. JS之鼠标改变img
  18. json_encode 中文 null
  19. linux 查询管道过滤,带上标题字段
  20. 【分布式计算】关于Hadoop、Spark、Storm的讨论

热门文章

  1. 数字签名中公钥和私钥是什么?对称加密与非对称加密,以及RSA的原理
  2. pandas 从txt读取DataFrame&DataFrame格式化保存到txt
  3. 【我的Android进阶之旅】解决sqlcipher库:java.lang.IllegalStateException: get field slot from row 0 col 0 failed.
  4. zcash 的资料
  5. X-NUCA联赛WEB赛前指导write-up
  6. 使用jackson工具类把对象或集合转为JSON格式
  7. 爬取乌云上所有人民币和乌云符号的漏洞(python脚本)
  8. Flume同时输出数据到HDFS和kafka
  9. 【运维技术】kafka三实例集群环境搭建及测试使用
  10. 怎样快速掌握一个用你没学过的框架写的PHP项目?