详解:http://www.cocoachina.com/industry/20140710/9089.html
iOS的入口在main.m文件:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
main函数的两个参数,iOS中没有用到,包括这两个参数是为了与标准ANSI C保持一致。
UIApplicationMain函数,前两个和main函数一样,重点是后两个
后两个参数分别表示程序的主要类(principal class)和代理类(delegate class)。如果主要类(principal class)为nil,将从Info.plist中获取,如果Info.plist中不存在对应的key,则默认为UIApplication;如果代理类(delegate class)将在新建工程时创建。
根据UIApplicationMain函数,程序将进入AppDelegate.m,这个文件是xcode新建工程时自动生成的。下面看一下AppDelegate.m文件,这个关乎着应用程序的生命周期。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
//在应用程序启动后,要执行的委托调用。
} - (void)applicationWillResignActive:(UIApplication *)application {
//在应用程序将要由活动状态切换到非活动状态时候,要执行的委托调用,如 按下 home 按钮,返回主屏幕,或全屏之间切换应用程序等。
当出现警告式响应中断时,我们需要进行如下操作.
①停止timer 和其他周期性的任务
②停止任何正在运行的请求
③暂停视频的播放
④如果是游戏那就暂停它
⑤减少OpenGL ES的帧率
⑥挂起任何分发的队列和不重要的操作队列(你可以继续处理网络请求或其他时间敏感的后台任务)
当程序回到active状态,我们需要在- (void)applicationDidBecomeActive:(UIApplication *)application方法中重新开始上述任务。不过游戏要回到暂停状态,不能自动开始。
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
//在应用程序已进入后台程序时,要执行的委托调用。
程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态。
Suspended挂起:程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。
假如要设置后台继续运行,则在这个函数里面设置即可
[application beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"begin Background Task With Expiration Handler");
}];
此时需要进行的操作有保存用户数据或状态信息,所有没写到磁盘的文件或信息,在进入后台时,最后都写到磁盘去,因为程序可能在后台被杀死。释放尽可能释放的内存.有大概5秒的时间完成这些任务。如果超过时间还有未完成的任务,程序就会被终止而且从内存中清除。
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
//在应用程序将要进入前台时(被激活),要执行的委托调用,刚好与 applicationWillResignActive 方法相对应。
} - (void)applicationDidBecomeActive:(UIApplication *)application {
//在应用程序已被激活后,要执行的委托调用,刚好与 applicationDidEnterBackground 方法相对应。(进入前台就走此方法,可在此进行一些操作)
} - (void)applicationWillTerminate:(UIApplication *)application {
//在应用程序要完全推出的时候,要执行的委托调用。
通常是用来保存数据和一些退出前的清理工作。这个需要在inför.plish中设置UIApplicationExitsOnSuspend的键值
app如果终止了,系统会调用app的代理的方法 - (void)applicationWillTerminate:(UIApplication *)application,这样可以让你可以做一些清理工作。你可以保存一些数据或app的状态。这个方法也有5秒钟的限制。超时后方法会返回程序从内存中清除。
}