10.20-ios应用程序的生命周期和视图控制器

一、 应用程序的生命周期状态:

-------

程序从上一次退出后第一次开始启动:

1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    第一次启动完成时调用

 

2. became active: 活跃状态, 调用 - (void)applicationDidBecomeActive:

 

-------

按下home键后,将依次进入下面两个状态,程序并没有被终止,只是暂时停止运行,不再占有cpu和内存,程序的运行状态和寄存器的值都将保存起来,下一次点击该应用程序时,将从上次运行的位置继续运行。

3. resign active:不活跃状态, 调用 - (void)applicationWillResignActive: 

 

4. background: 后台(将停止运行--最多运行600s, 停止运行后,将不再占用内存和cpu资源,五种应用程序除外:音乐、导航、定位、VOIP、NewsStand)。   将调用 - (void)applicationDidEnterBackground:

 

-------

重新点击应用程序后,将进入下面的这个状态

5. will Enter Foreground,进入前台。  将调用- (void)applicationWillEnterForeground:  

 

-------

只有真正退出一个程序后,该程序才真正的不再运行,下一次启动程序,将从头开始启动

6. Terminate: 退出, 将调用 - (void)applicationWillTerminate:

 

二、Xcode中ios应用程序启动流程,大概如下

    main方法 —>   AppDelegate --> AppDelegate中的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: 方法  ,加载启动应用程序  —>    查看AppDelegete的配置信息  —>   根据main.storyboard, 产生一个ViewController类 和 其对象 —>    进入viewController对象的 viewDidLoad方法,该方法表示viewController所拥有的视图都已经加载进内存了,但是视图并没有显示。-> 依次进入viewController对象的 viewWillAppear:  , viewWillLayoutSubviews,  viewDidLayoutSubviews 和 viewDidAppear: 方法来显示根视图 和 子视图, -> AppDelegate中的 - (void)applicationDidBecomeActive: 使程序进入活跃状态 -> 等待用户的事件

上面的流程有几点要注意: 

       AppDelegate中有一个UIWindow类型的window属性,如果在   (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:  方法(即程序加载启动完成时)中,如果设置了这个window属性的值,那么同时也要给该window设置一个根视图控制器 rootViewController。 设置根视图控制器的过程中,会访问该rootViewController的view属性。如果该view属性还是空的,将调用loadView方法,在该方法中需要产生一个UIView对象设置view 属性。loadView方法执行完将执行rootViewController的viewDidLoad方法来加载该rootViewController上的所有视图,但是这些视图还没有显示。  设置完window的根视图控制器后,还要显示该window,用 [_window makeKeyAndVisible] 来显示。同时该方法会使 rootViewController上的view准备显示,依次执行viewWillAppear:  , viewWillLayoutSubviews,  viewDidLayoutSubviews 和 viewDidAppear: 方法来显示根视图 和 子视图。 这中间注意到,压根没有访问过storyboard中的内容。所以该流程可以帮助我们在不用storyboard的情况下来运行程序。其实我们在storyboard中创建的一个视图控制器只是属于其所属类的一个对象,和我们在代码中显示创建的viewController并不是同一个对象。

 

posted @ 2014-10-20 23:26  _蚕豆_  阅读(169)  评论(0)    收藏  举报