- 应用程序启动步骤
- 一程序启动的完整过程
- 二视图加载流程
- 三视图卸载流程
- 四UIApplicationMain
- 五解读main函数
- 六UIApplication
- UIApplication简介
- UIApplication一些功能
- 七UIApplicationDelegate
- UIApplicationDelegate简介
- AppDelegatem
应用程序启动步骤
一、程序启动的完整过程
程序启动的完整过程
1.main函数
2.UIApplicationMain
* 创建UIApplication对象
* 创建UIApplication的delegate对象
3.delegate对象开始处理(监听)系统事件(没有storyboard)
* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法
* 在application:didFinishLaunchingWithOptions:中创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)
* 创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
二、视图加载流程
三、视图卸载流程
四、UIApplicationMain
在main.m的main函数中执行了 UIApplicationMain 这个方法,这是ios程序的入口点
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
argc、argv:ISO C标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可
principalClassName:指定应用程序类,该类必须是UIApplication或其子类。如果为nil,则用UIApplication类作为默认值
delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议
五、解读main函数
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
•
•方法说明:
•1) 由第3个参数创建一个UIApplication对象,一个程序对应一个UIApplication对象(单例),UIApplication对象是程序的象征
•2) 由第4个参数创建一个UIApplication的delegate对象
•3) 开启一个消息循环(不断地监听地一些系统事件)
•4) 监听到相应的事件后,就会给代理发送相应的消息,应用程序启动完成后,首先会调用代理对象的application:didFinishLaunchingWithOptions:方法
六、UIApplication
1.UIApplication简介
•UIApplication是应用程序的核心,每一个程序在运行期必须有UIApplication(或子类)的一个实例(有且仅有一个),通过[UIApplication sharedApplication]可以得到这个单例实例的指针
•UIApplication帮助管理应用程序的生命周期,而它通过delegate来履行这个任务
•UIApplication可以接收事件,把所有用户事件都放入队列,逐个处理,它会发送当前事件给一个合适的目标控件进行处理。它还将部分事件转给delegate对象来处理,delegate可处理的事件包括:应用程序的生命周期事件(如程序启动和关闭)、系统事件(如来电)
2.UIApplication一些功能
下面是这个类的一些功能:
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([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive) {
NSLog(@“程序在运行状态”);
}
4.阻止屏幕变暗进入休眠状态
// 阻止屏幕变暗,慎重使用,缺省为no 2.0
[UIApplicationsharedApplication].idleTimerDisabled = YES;
//
(慎重使用本功能,因为非常耗电)
5.显示联网状态
//显示联网标记 2.0
[UIApplicationsharedApplication].networkActivityIndicatorVisible = YES;
6.在map上显示一个地址
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.发送电子邮件
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"]];
七、UIApplicationDelegate
1.UIApplicationDelegate简介
•在开发过程中,UIApplication是一个非常重要的全局对象。但在实际编程中我们并不直接和UIApplication对象打交道,而是和其代理打交道,它的代理必须遵守UIApplicationDelegate协议,代理提供了相关的生命周期方法来处理应用程序的系统事件
•ios设备的内存极其优先,如果为app分配了太多内存,操作系统会终止app的运行,在UIApplication接收到这个事件后它会调用代理的applicationDidReceiveMemoryWarning方法,代理在这个方法内可以进行释放内存的操作以防止操作系统强制终止应用程序的运行
•ios并不是多任务的操作系统,所以app很容易受到打扰。比如一个来电可能导致app失去焦点,如果这个时候接听了电话,那么app会自动终止运行
•还有很多其它类似的事件会导致app失去焦点
–app失去焦点前会调用代理的applicationWillResignActive
–app再次获取焦点时会调用代理的applicationDidBecomeActive
–在运行app时锁屏会调用代理的applicationWillResignActive
–当屏幕被解锁时,会调用代理的applicationDidBecomeActive
2.AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
/**
1. 应用程序成为激活状态后,才可以与用户进行交互。
2. 如果要做保存游戏状态之类操作,应该在注销激活方法中处理,
因为用户可能会双击home键,打开任务栏,此时应用程序不会退出到后台!
3. 如果要做恢复游戏状态之类的操作,应该在成为激活方法中处理,
因为用户可能是从任务栏中返回的。
4. 如果应用程序运行过程中,内存或其他原因,程序被系统强行退出时,会调用Terminate方法,
开发者,可以再此记录应用程序被退出前的状态,以便改进系统
5. 应用程序退出到后台后,未必会是休眠状态,有可能会继续运行,例如:微博、QQ、音乐播放器等软件
6. 在UIKit开发中,通常不用在delegate中写内存警告方法,直接在ViewController中进行处理即可。而在cocos2d的开发中,必须要在内存警告方法中进行处理,以免出现程序闪退的情况。
*/
#pragma mark 应用程序第一次完成启动,第一个调用的代理方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 用户进入系统后,直接将图标右上角的数字清零
[application setApplicationIconBadgeNumber:0];
// Override point for customization after application launch.
return YES;
}
#pragma mark - 注销激活状态
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"注销激活");
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
#pragma mark 进入后台时调用
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"进入后台");
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
#pragma mark 应用程序准备进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"准备进入前台");
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
#pragma mark 成为激活对象
- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSLog(@"成为激活对象");
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
#pragma mark 将被终止 —— 这个方法是由系统调用的,一般情况下,无法测出来
- (void)applicationWillTerminate:(UIApplication *)application
{
NSLog(@"应用程序终止...");
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
#pragma mark 接收内存警告方法
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
// 会去通知UIViewController执行相应的内存警告方法,以释放一部分资源,保证应用程序的正常运行
}
@end