美文网首页iOS Developer
iOS程序运行时的生命周期

iOS程序运行时的生命周期

作者: Jecky丶 | 来源:发表于2016-05-05 10:44 被阅读203次

程序启动的完整过程:

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。

相关文章

网友评论

    本文标题:iOS程序运行时的生命周期

    本文链接:https://www.haomeiwen.com/subject/heddrttx.html