`
shlei
  • 浏览: 288671 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ViewController的生命周期分析和使用

    博客分类:
  • iOS
ios 
阅读更多
iOS的SDK中提供很多原生ViewController,大大提高了我们的开发效率,下面是我的一些经验。

一、结构

按结构可以对iOS的所有ViewController分成两类:
1、主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITableViewController,UIViewController。
2、用于控制和显示其他ViewController的ViewController。这种ViewController一般都是一个ViewController的容器。如UINavigationController,UITabbarController。它们都有一个属性:viewControllers。其中UINavigationController表示一种Stack式结构,push一个ViewController或pop一次,因此后一个ViewController一般会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列的。
第一种ViewController会经常被继承,用来显示不同的数据给用户。而第二种很少被继承,除非你真的需要自定义它。
注:细心的同学应该能发现,在Xcode中新建一个ViewController时,只可以选择继承自UIViewController和UITableViewController,而它们都是第一种。
图1

二、Controller和View的生命周期

这里指的View是指Controller的View。它作为Controler的属性,生命周期在Controller的生命周期内。就是说你的Controller不能在view释放前就释放了。
图2 ViewController生命周期

当你alloc并init了一个ViewController时,这个ViewController应该是还没有创建view的。ViewController的view是使用了lazyInit方式创建,就是说你调用的view属性的getter:[self view]。在getter里会先判断view是否创建,如果没有创建,那么会调用loadView来创建view。loadView完成时会继续调用viewDidLoad。loadView和viewDidLoad的一个区别就是:loadView时还没有view。而viewDidLoad时view以及创建好了。
当view被添加其他view中之前时,会调用viewWillAppear,而之后会调用viewDidAppear。
当view从其他view中移出之前时,会调用viewWillDisAppear,而之后会调用viewDidDisappear。
当view不在使用,而且是disappeared,受到内存警告时,如果你是通过nib载入的viewController或者在loadView方法里调用了super loadView,那么viewController会将view释放并将其指向nil,然后调用viewDidUnload。

三、代码组织(如何设计良好的viewcontroller)

ViewController生命周期中有那么多函数,一个重要问题就是什么代码该写在什么地方。
1、init里不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要掉self.view,否则会导致viewcontroller创建view。(因为view是lazyinit的)。
2、loadView中只初始化view,一般用于创建比较关键的view如tableViewController的tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非关键的view。如果你是从nib文件中创建的viewController在这里一定要首先调用super的loadView方法,但建议不要重载这个方法。
3、viewDidLoad 这时候view已经有了,最适合创建一些附加的view和控件了。有一点需要注意的是,viewDidLoad会调用多次(viewcontroller可能多次载入view,参见图2)。
4、viewWillAppear 这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色)。
5、viewDidAppear 一般用于显示后,在切换动画后,如果有需要的操作,可以在这里加入相关代码。
6、viewDidUnload 这时候viewController的view已经是nil了。由于这一般发生在内存警告时,所以在这里你应该将那些不在显示的view释放了。比如你在viewcontroller的view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以免占用不必要的内存,而这个label在viewDidLoad时会重新创建。

From http://xcodev.com/341.html
分享到:
评论

相关推荐

    Viewrrlkalkadsva

    ### ViewController的生命周期分析和使用 #### 一、结构概述 在iOS SDK中,ViewController作为界面控制器的核心组件之一,被广泛应用于各种应用的开发之中。为了更好地理解和使用ViewController,我们可以将其分为...

    ViewController实现了多个页面的选择

    这通常涉及到重写或实现一些特定的方法,如`viewDidLoad()`,`viewWillAppear()`,`viewDidAppear()`等生命周期方法,以及`prepare(for:sender:)`来处理页面间的跳转。 在`MNTabbarDemo`中,每个页面可能有自己的...

    swift-统计程序的界面的FPS信息便于分析界面的性能

    8. **View Controller Life Cycle**:理解ViewController的生命周期对性能的影响,比如在适当的时候禁用不必要的更新,减少视图层次结构,都可能提升FPS。 9. **Auto Layout性能**:复杂的Auto Layout约束可能导致...

    UI第一章:iPhone开发概述Demo源代码.zip

    8. **生命周期**:ViewController有自己的生命周期,包括初始化、加载视图、显示视图等阶段,理解这些阶段对于正确处理数据和更新界面至关重要。 9. **协议和代理**:在iOS开发中,协议常用来定义不同对象间如何...

    iOS开发指南:从零基础到App Store上架

    理解ViewController的生命周期,如初始化、加载视图、显示、销毁等状态,可以帮助开发者有效地管理资源和响应用户操作。 iOS应用还需要处理数据存储,包括使用SQLite数据库、Core Data框架或者云服务。Core Data是...

    ios源码之一个简单的智力游戏match_game.rar

    8. **App生命周期和状态管理**: iOS应用有多种生命周期状态,如初始化、激活、后台运行和退出。开发者需要确保在不同状态下正确保存和恢复游戏状态,以提供良好的用户体验。 9. **测试与调试**: Xcode内置了...

    IOS应用源码之一个效果震撼的视图开场动态效果 .rar

    8. **ViewController生命周期**:在启动动态效果时,开发者需要在合适的生命周期方法(如`viewDidLoad`、`viewWillAppear`或`viewDidAppear`)中添加动画代码,确保在正确的时间点显示动画。 9. **响应式设计**:...

    藏经阁-小红书移动端自动化数据采集实践.pdf

    在iOS中就是ViewController的生命周期,在Android中就是Activity/Fragment 的生命周期。这样其实非常简单了,我们只要根据我们的需求去hook一些生命周期的方法就行了。在iOS 中我们可以使用runtime的method swizzle ...

    ios应用源码之视图控制器(无动画版) 20181210

    在iOS应用开发中,视图控制器(UIViewController)是构建用户界面的核心组件,它负责管理一个或多个视图的生命周期和行为。本资源“ios应用源码之视图控制器(无动画版)20181210”提供了一个基础的、不包含动画效果...

    ios开发介绍及心得.docx

    - 了解AppDelegate和ViewController中的生命周期方法可以帮助开发者更好地管理应用的状态和资源,特别是在处理内存管理和后台处理时。 4. **界面设计与用户体验:** - iOS应用非常注重美观的界面和优秀的用户体验...

    移动应用开发是一个复杂但充满挑战和机遇的领域1.txt

    iOS开发者则需要了解iOS的视图控制器(ViewController)、应用生命周期以及如何使用Xcode进行项目管理和调试。 集成开发环境(IDE)的选择对于提升开发效率起到关键作用。对于Android开发者来说,Android Studio提供...

    ios源码之一天结束前时间的倒计时应用MinutesToMidnight.rar

    - ViewController的生命周期方法,如`viewDidLoad`和`viewWillAppear`,将在倒计时应用中起到关键作用。开发者需要在适当的方法中初始化定时器,并在视图消失时取消或暂停它。 10. **用户交互反馈**: - 为了提供...

    IOS应用源码之启动页面SplashDemo .zip

    6. **生命周期方法**:在ViewController类中,我们可能会发现如`application(_:didFinishLaunchingWithOptions:)`或`viewDidLoad()`等生命周期方法的使用。这些方法是控制启动屏幕显示时间的关键,开发者通常在这里...

    移动应用开发综合实训.zip

    移动应用开发是一个涵盖广泛领域的主题,它涉及到使用各种编程语言和...通过这个综合实训,你不仅会获得扎实的编程技能,还能理解移动应用开发的完整生命周期,从需求分析到上线维护,为你的未来职业生涯打下坚实基础。

    简单的滤镜demo.zipIOS应用例子源码下载

    2. `AppDelegate.swift` 或 `AppDelegate.m`: 应用程序的代理,负责初始化和管理应用的生命周期。这里可能会有与界面初始化或图片资源加载相关的设置。 3. `FilterManager.swift` 或 `FilterManager.m`: 这可能是一...

    IOS应用源码——whenurnotaround-MC-204575c.rar

    C`(应用委托类,处理应用生命周期事件)、`ViewController`(视图控制器,控制界面交互)、`Storyboard`(界面布局文件)、`Model`(数据模型,存储和处理数据)、`Service`(网络请求和服务接口)以及`Utils`...

    iOS开发教程案例代码.zip

    在实际项目中,我们还会遇到生命周期管理,比如ViewController的生命周期方法,如`viewDidLoad`、`viewWillAppear`等。另外,iOS应用的权限管理也是重要一环,例如访问用户位置、照片库或推送通知等,都需要获取用户...

    IOS应用源码之cmkilger-Vici-558464e.zip

    9. **第三方库集成**:如果存在`Pods`目录,会涉及CocoaPods的使用和第三方库的集成。 10. **App生命周期**:通过AppDelegate学习应用启动、暂停、恢复和终止等生命周期事件的处理。 11. **网络请求**:可能包含网络...

    iOS游戏应用源代码——leonardoeloy-VolcanoPong-dbb7121.zip

    同时,此项目也是理解iOS应用生命周期、多线程编程以及优化游戏性能的好例子。无论你是初学者还是有经验的开发者,这个开源项目都能提供宝贵的学习资源,帮助你在iOS游戏开发的道路上更进一步。

    IOS应用源码——视图控制器(无动画版).zip

    6. **生命周期管理**:UIViewController遵循特定的生命周期,包括初始化、加载视图、显示、隐藏和销毁等阶段,开发者需要在相应的方法中编写相应的代码。 7. **内存管理**:在内存压力下,系统可能会销毁视图控制器...

Global site tag (gtag.js) - Google Analytics