应用生命周期

  App启动:当App启动时,首先由not running状态切换到inactive状态,此时调用application:didFinishLaunchingWithOptions:方法;然后由inactive状态切换到active状态,此时调用applicationDidBecomeActive:方法。当App发生中断时,由active状态切换到inactive状态,此时调用applicationWillResignActive:方法。

  来回切换App:当切换到另一个App时,由状态active切换到inactive,此时调用applicationWillResignActive:方法;然后从inactive状态切换到running状态,此时调用applicationDidEnterBackground:方法。而当切换回本来的App时,由running状态切换到inactive状态,此时调用applicationWillEnterForeground:方法,然后由inactive状态切换到active状态,调用applicationDidBecomeActive:方法。

  锁屏:当手机锁屏时,由状态active切换到inactive,此时调用applicationWillResignActive:;然后再由inactive状态切换到running状态,此时调用applicationDidEnterBackground:方法。 系统常常是为其他app启动时由于内存不足而回收内存最后需要终止应用程序,但有时也会是由于app很长时间才响应而终止。如果app当时运行在后台并且没有暂停,系统会在应用程序终止之前调用applicationWillTerminate:来保存用户的一些重要数据以便下次启动时恢复到app原来的状态。

Not running:未运行,程序没启动

Inactive   :未激活,程序在前台运行,不过没接受到事件,没有事件处理的状态下通常处于这个状态。

Active         :激活   程序在前台并且接收到了事件

Backgound :后台   程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。

Suspended :挂起  程序在后台不能执行代码。

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

//告诉代理进程启动但还没进入状态保存

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

// 告诉代理启动基本完成程序准备开始运行

- (void)applicationWillResignActive:(UIApplication *)application

// 当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了

- (void)applicationDidBecomeActive:(UIApplication *)application

//   当应用程序入活动状态执行,这个刚好跟上面那个方法相反

- (void)applicationDidEnterBackground:(UIApplication *)application

//  当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可

- (void)applicationWillEnterForeground:(UIApplication *)application

//当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。

- (void)applicationWillTerminate:(UIApplication *)application

//当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。

- (void)applicationDidFinishLaunching:(UIApplication*)application

//当程序载入后执行

 
 
视图生命周期

  viewController叫做视图控制器。对内是用于管理视图,对外则是与其他的viewcontroller进行通信。它继承于NSObject。它分为两种类型,一种叫contentViewController,内容视图控制器,主要用于体现内容 如UITableView UIViewController这种直接显示内容的;还有一种叫做containerViewController,容器视图类。典型的就是tabBar,和navigation.它还包含好几个其它的viewController.

每个view都有一个viewController。且view的生命周期也在viewController里面。所以在view释放之前,viewcontroller是不可以释放的。

step1:initWithNib    viewController 会进行alloc,并init.

step2: loadView       在这里会看它的子类是否有重写这个函数,如果重写了则调用子类的,否则就调用她自己的。注意,这个时候视图还是没有没加载进来的哦。

step3:viewDidLoad    这个时候视图已经存在了。可以在这里添加你想要添加的UI控件了。

step4:viewWillAppear 视图将出现在屏幕上了

step5:viewDidAppear   视图已经成功在屏幕上渲染完成了

step6:viewWillDisappear  视图将要消失了

step7:viewDidDisappear  视图从屏幕上消失了

step8:viewDidUnLoad     当发生内存警告的时候,如果本视图不是当前正在显示的视图,则会执行这个函数。将子视图释放。

step9:dealloc          释放viewController

而view的生命周期则是step3——step8.

viewController的生命周期就是 step1——step9

  
didReceiveMemoryWarning

  当程序接到内存警告时View Controller将会收到这个消息:didReceiveMemoryWarning

  从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。

  这个函数的默认实现是:检查controller是否可以安全地释放它的view(这里加粗的view指的是controller的view属性),比如view本身没有superview并且可以被很容易地重建(从nib或者loadView函数)。

  如果view可以被释放,那么这个函数释放view并调用viewDidUnload。

  你可以重载这个函数来释放controller中使用的其他内存。但要记得调用这个函数的super实现来允许父类(一般是UIVIewController)释放view。

  如果你的ViewController保存着view的子view的引用,那么,在早期的iOS版本中,你应该在这个函数中来释放这些引用。而在iOS3.0或更高版本中,你应该在viewDidUnload中释放这些引用。

  应用启动:

  应用程序在启动的时候,会执行main函数,而main函数里面主要执行了UIApplicationMain函数。UIApplicationMain函数执行完主要做了以下三个操作:

  (1)创建应用程序UIApplication对象。

  (2)创建了应用程序代理对象。默认的应用程序代理对象是AppDelegate。

  (3)建立一个事件循环RunLoop。用来实时监测应用程序中的各种事件(触摸,晃动,远程控制事件,通知,观察者,timer等等)。

  然后

  1  在UIApplication代理实例中重写启动方法,设置第一ViewController

  2 在第一ViewController中添加控件,实现对应的程序界面。

  

  viewController方法的执行时机

(1)创建

xxx *x = [[xxx  alloc] init]  // 作用:分配内存空间,创建控制器时使用

(2)加载和显示:

- (void)loadView: // 作用:加载根视图(即为self.view赋值)  ,在控制器view属性的getter方法首次调用的时候执行此方法。

根视图已加载:

- (void)viewDidLoad// loadView执行完毕之后,立即执行此方法。作用:给创建好的控件设置值,做网络请求,开启timer等

loadView 和 viewDidLoad 当首次访问controller的根视图时才会执行,即view属性的getter方法首次使用时执行, loadView 执行在前, viewDidLoad执行在后。

如果重写了 loadView 一定要给控制器的根视图赋值(self.view = xxView;),在给控制器的根视图赋值的之前,不能使用控制器view属性的getter方法,否则会重复执行 loadView 和 viewDidLoad 方法。

视图将要显示:

- (void)viewWillAppear:

视图将要被添加到 UI 层级上,还没有添加时执行。(此时视图还没有显示)

视图已经显示:

- (void)viewDidAppear

视图已经被添加到 UI 层级上,视图已经显示出来时执行。(视图已经显示)

视图将要消失:

- (void)viewWillDisappear:

视图将要被从 UI 层级上面移除,但视图还没有移除时执行。 (视图还可见)

视图已经消失:

- (void)viewDidDisappear:

视图已经从 UI 层级上面移除,视图已经不可见时执行。 (视图不可见)

(3)销毁:

- (void)viewWillUnload

iOS6.0之后已经被弃用。iOS 5.0 之前,当低内存且控制器的view不需要使用的时候会调用这个方法,即当控制器的根视图 将要 被释放时执行([vc.view release],vc.view还未置空),我们可以在这个方法中移除一些跟视图相关的观察者和通知,并记录视图的状态,以便之后重新创建视图。 iOS6.0 之后不再需要做释放了,该方法也被遗弃了。

- (void)viewDidUnload

iOS6.0 之后已经被弃用。iOS 5.0 之前,当低内存且控制器的view不需要使用的时候会调用这个方法,即当控制器的根视图被释放时执行([vc.view release],vc.view已经为nil),这个方法给我们一个机会做内存的相关清理工作,如果控制器对某些视图有引用,可以在这里释放这些引用,同样可以释放一些懒加载的对象,但是不要释放那些不容易重新加载的数据。 iOS6.0 之后不再需要做释放了,该方法也被遗弃了。

iOS 生命周期的更多相关文章

  1. 从实践谈iOS生命周期

    从实践谈iOS生命周期 个人感觉生命周期无论在Android,还是iOS都是很重要的概念,因为在每个声明周期的状态下我们可以做很多预加载或者处理的操作.因此在这里主要总结下ViewController ...

  2. iOS 生命周期 -init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear 区别和用途

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...

  3. iOS生命周期 & 通知中心

    笔记内容 学习笔记-段玉磊 Stanford course View Controller Lifecycle 这篇文是我记载Developing iOS 7 Apps公开课 第5课的笔记 UITex ...

  4. iOS生命周期

    1.application didFinishLaunchingWithOptions:当应用程序启动时执行,应用程序启动入口,只在应用程序启动时执行一次.若用户直接启动,lauchOptions内无 ...

  5. 生命周期-初识IOS

    经常因为生命周期的事情,而视图顺序加载错误,或者出现一系列的小错误并且修改不出来,程序员不知道生命周期确实挺可悲的. IOS生命周期: 自上而下的执行,并且viewDidLoad只会执行一次,所以我们 ...

  6. iOS开发——生命周期

    为了处理好应用程序的挂起.暂停等情况下的数据保存,或对应添加所需处理,我们必须了解ios生命周期. 但是不要去背去记,做个实验就好. - (BOOL)application:(UIApplicatio ...

  7. iOS - ViewController的生命周期

    iOS SDK中提供很多原生的ViewController,大大提高了我们的开发效率:那么下面我们就根据开发中我们常用的ViewController谈一谈它的生命周期: (一)按照结构和用法可以对iO ...

  8. iOS 应用程序生命周期

    开发应用程序都要了解其生命周期. 今天我们接触一下iOS应用程序的生命周期, iOS的入口在main.m文件: int main(int argc, char * argv[]) { @autorel ...

  9. 图解ios程序生命周期

    图解ios程序生命周期 应用程序启动后状态有Active.Inactive.Background.Suspended.Not running这5种状态,几种状态的转换见下图: 在AppDelegate ...

随机推荐

  1. 单例模式:Instance

    前言: 学习面向对象程序设计的朋友应该知道,我们大多数情况下通过 new 操作来实例化对象的.对于一些仅需要一次初始化的对象来说,频繁的new操作无疑会过多浪费内存空间.基于此,单例模式便应运而生了. ...

  2. Extract Fasta Sequences Sub Sets by position

    cut -d " " -f 1 sequences.fa | tr -s "\n" "\t"| sed -s 's/>/\n/g' & ...

  3. [bzoj1618][Usaco2008 Nov]购买干草

    Description    约翰的干草库存已经告罄,他打算为奶牛们采购磅干草.    他知道个干草公司,现在用1到给它们编号.第个公司卖的干草包重量为磅,需要的开销为美元.每个干草公司的货源都十分充 ...

  4. 【BZOJ-1017】魔兽地图DotR 树形DP + 背包

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1566  Solved: 705[Submit][S ...

  5. SPOJ GSS5 Can you answer these queries V

    Time Limit: 132MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Description You are g ...

  6. SPOJ375 Query on a tree

    Description You are given a tree (an acyclic undirected connected graph) with N nodes, and edges num ...

  7. 服务器添加ipa MIME 类型,防止ipa下载后变zip后缀

    客户反映apk文件下载 后缀会变为zip   打开mime.types文件   application/iphone pxl ipa application/vnd.android.package-a ...

  8. 为你解惑之WPF经典9问详解

    本文解答了关于WPF的9个最常见的问题.从某种意义上讲,这两种技术是相互关联的:它们都是关于界面表现的技术,更进一步的,Silverlight是基于WPF的,是它的一个子集.不仅从理论上介绍了这两种技 ...

  9. React Native 开发之 (07) 常用组件-View

    掌握了React Native的组件就可以使用IOS的原生组件和API. 一 View组件 就像开发web应用程序中,需要使用很多的HTML标签.例如 div,form.但是在基于DIV+CSS布局的 ...

  10. C++ STL中vector的内存机制和性能分析

    vecotr是动态数组,顾名思义他可以动态的增加自己的长度. 内存机制: 但是怎样的增加自己的长度? vector有两个函数一个是capacity()返回内存空间即缓冲区的大小,另一个是size()返 ...