程序猿们,iOS中是有生命周期的
Posted kaihaOS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序猿们,iOS中是有生命周期的相关的知识,希望对你有一定的参考价值。
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原来的状态。 3、简述视图生命周期 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 7、 ViewController的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中释放这些引用。 7. 应用程序在启动的时候主要做了什么操作? 答:应用程序在启动的时候,会执行 main 函数,而 main 函数里面主要执行了 UIApplicationMain 函数。 UIApplicationMain 函数执行完主要做了以下三个操作: (1) 创建应用程序 UIApplication 对象。 (2) 创建了应用程序代理对象。默认的应用程序代理对象是 AppDelegate 。 (3) 建立一个事件循环 RunLoop 。用来实时监测应用程序中的各种事件(触摸,晃动,远程控制事件,通知,观察者, timer 等等)。 8. 请描述一下 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 之后不再需要做释放了,该方法也被遗弃了。 21. 简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期? 应用程序的状态: 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 //当程序载入后执行 22.描述应用程序的启动顺序。 ①、程序入口main函数创建UIApplication实例和UIApplication代理实例 ②、在UIApplication代理实例中重写启动方法,设置第一ViewController ③、在第一ViewController中添加控件,实现对应的程序界面。 23.ViewController的alloc,loadView。viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?(UI第三讲 自定义视图、视图控制器)alloc初始化当前的ViewController loadView:没有正在使用nib视图页面,子类将会创建自己的自定义视图层 viewDidLoad:试图被加载后调用 viewWillAppear:试图即将出现的时候调用 viewDidUnload:<iOS6之后废弃>当系统内存吃紧的时候会调用该方法,释放掉当前未在window中显示的试图和对应的控制器以上是关于程序猿们,iOS中是有生命周期的的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 项目中管理 coredata/sqlite 数据库生命周期