程序启动的完整过程:
1、先执行main函数,main内部会调用UIApplicationMain函数,该函数的声明如下:
intUIApplicationMain(intargc,charargv[], NSString principalClassName, NSString *delegateClassName)。
argc、argv:标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可
principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议。
2、在UIApplicationMain函数里面做了如下几件事情:
(1)、根据传入的第三个参数创建UIApplication对象或它的子类对象。如果该参数为nil,直接使用该UIApplication来创建。(该参数只能传人UIApplication或者是它的子类)
(2)、根据传入的第四个参数创建AppDelegate对象,并将该对象赋值给第1步创建的UIApplication对象的delegate属性。
(3)、开启一个事件循环,循环监控应用程序发生的事件。每监听到对应的系统事件时,就会通知AppDelegate。
AppDelegate中的方法:
//程序已经启动完成
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
returnYES;
}
//程序即将失去焦点
- (void)applicationWillResignActive:(UIApplication*)application {
}
//程序已经进入后台
- (void)applicationDidEnterBackground:(UIApplication*)application {
}
//程序将要进入前台
- (void)applicationWillEnterForeground:(UIApplication*)application {
}
//程序即将获得焦点
- (void)applicationDidBecomeActive:(UIApplication*)application {
}
//程序即将销毁terminate-销毁
- (void)applicationWillTerminate:(UIApplication*)application {
}
执行顺序:
/**
启动时:
didFinishLaunchingWithOptions,程序启动完成->
applicationDidBecomeActive,程序即将获得焦点->
进入后台时:
applicationWillResignActive,程序即将失去焦点->
applicationDidEnterBackground,程序已经进入后台->
再次进入前台时:
applicationWillEnterForeground,程序将要进入前台->
applicationDidBecomeActive,程序即将获得焦点->
一直死循环进行
*/
当程序收到内存警告时:
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
//调用此方法
}
当应用程序接收到内存警告的时候怎么处理?
答:当收到内存警告的时候,应用程序会将警告一级一级往下传递,传递顺序是UIApplication->UIWindow->rootViewController(如果有子控制器)->childViewControllers。
当控制器接收到警告之后,就会调用didReceiveMemoryWarning方法。一般会在这个方法中做几件事:
1、在iOS6之前的处理方式:
a.调用每个控制器的didReceiveMemoryWarning方法,在该方法中判断控制器的view是否存在,
如果存在,系统又会判断view是否可以被销毁(只要控制器的view不是正在显示在界面上。那么系统就会认为该view是可以被销毁的).
b.如果可以销毁,控制器会调用viewWillUnload销毁view并设置view属性的值为nil并保存跟view属性相关的数据,以便重新重建view的时候可以恢复.
c.最后调用控制器的viewDidUnload方法,在viewDidUnload方法中释放所有view强引用的子控件。重写这三个方法的时候必须要调用父类的方法。
2、在iOS6之后的处理方式如下:
- (void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
// Add code to clean up any of your own resources that are no longer necessary.
if([self.view window] ==nil)
{
// Add code to preserve data stored in the views that might be
// needed later.
// Add code to clean up other strong references to the view in
// the view hierarchy.
self.view =nil;
}
}
1>调用父类的didReceiveMemoryWarning来确保父类的行为能够被执行。
2>清理控制器不再需要的资源
3>判断控制器的view是不是正在在窗口上显示,如果不是,先保存跟view或子view相关的数据。清空所有子控件的强引用。
4>最后设置控制器的view为nil。