美文网首页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