UIViewController生命周期控制

UIViewController介绍

官方的介绍例如以下

The UIViewController class provides the fundamental view-management model for all iOS apps. You rarely instantiate UIViewController objects directly. Instead, you instantiate subclasses of the UIViewController class based on the specific task each subclass
performs.

简单的说就是一个视图控制器类

ios6以后的一般的生命周期

ios6以后取消了viewWillUnload方法,apple官方文档说不是必需了(我勒个去了),大体就是view和显示分开了,当内存紧张的时候系统会帮你回收显示的贴图.这个贴图呢仅仅是先标记为已经清除,假设你没用到这块内存,下次须要显示这个view的时候,还能够立刻复用来.新的周期图大致例如以下.

在生命周期中, 给要做的事情分类

一千个人眼里有一千个哈姆雷特, 假设不统一下, 每一个程序猿依照自己的习惯的代码风格去写, 会给维护造成了困扰,所以我们给UIViewController的申明周期中加上一些方法来规范下

  • loadView 中加上三个方法

    • createFields 接受參数,初始化变量
    • createViews 创建视图
    • createEvents 绑定事件,如button的点击,NotificationCenter,kvo等
  • viewDidLoad

    • loadData 载入数据,调用一些api
  • dealloc

    • destroyEvents 取消事件的绑定
    • destroyViews 释放,销毁视图
    • destroyFields 释放,销毁引用的变量
  • didReceiveMemoryWarning

    • cleanData 释放一些能够释放的数据
  • 额外

    • enterForeground 进入前台时调用
    • enterBackground 进入后台时调用

规范文件内部组织结构

定义了执行时要做的事后,我们再来统一下文件内怎样写

首先是头文件

@interface UIViewController (base)
#pragma mark- model
// 定义model #pragma mark- view
// 定义view #pragma mark- api
// 定义api
@end

实现文件

#pragma mark - api
// 对外的接口 #pragma mark - rewrite
// 额外的重写的父类的方法 #pragma mark - private #pragma mark - 响应 model 的地方
#pragma mark 1 notification
#pragma mark 2 KVO #pragma mark - 响应 view 的地方
#pragma mark 1 target-action
#pragma mark 2 delegate dataSource protocol #pragma mark -

结束

至此呢,我们的UIViewController就有了一个统一的风格,在团队的扩建中,再统一下命名,代码看起来就舒服多了

实现代码

实现能够用runtime,也能够用基类, 个人推荐是用基类,可是以下的代码是runtime的

@implementation UIViewController (base)

+ (void)load
{
XY_swizzleInstanceMethod([UIViewController class], @selector(loadView), @selector(xy__loadView));
XY_swizzleInstanceMethod([UIViewController class], @selector(viewDidLoad), @selector(xy__viewDidLoad));
XY_swizzleInstanceMethod([UIViewController class], NSSelectorFromString(@"dealloc"), @selector(xy__dealloc));
XY_swizzleInstanceMethod([UIViewController class], @selector(didReceiveMemoryWarning), @selector(xy__didReceiveMemoryWarning));
} - (void)xy__loadView
{
[self xy__loadView]; if ([self respondsToSelector:@selector(createFields)])
[self performSelector:@selector(createFields)]; if ([self respondsToSelector:@selector(createViews)])
[self performSelector:@selector(createViews)]; if ([self respondsToSelector:@selector(enterBackground)])
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];
} if ([self respondsToSelector:@selector(enterForeground)])
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
} if ([self respondsToSelector:@selector(createEvents)])
[self performSelector:@selector(createEvents)];
} - (void)xy__dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self]; if ([self respondsToSelector:@selector(destroyEvents)])
[self performSelector:@selector(destroyEvents)]; if ([self respondsToSelector:@selector(destroyViews)])
[self performSelector:@selector(destroyViews)]; if ([self respondsToSelector:@selector(destroyFields)])
[self performSelector:@selector(destroyFields)]; [self xy__dealloc];
} - (void)xy__viewDidLoad
{
if ([self respondsToSelector:@selector(loadData)])
[self performSelector:@selector(loadData)]; [self xy__viewDidLoad];
} - (void)xy__didReceiveMemoryWarning
{
if ([self isViewLoaded] && [self.view window] == nil)
{
if ([self respondsToSelector:@selector(cleanData)])
[self performSelector:@selector(cleanData)];
} [self xy__didReceiveMemoryWarning];
} @end

UIViewController生命周期控制的更多相关文章

  1. UIViewController生命周期控制-开发规范

    从网上各位iOS们收集并总结: 各方法使用: init 中初始化一些UI组件,比如UIButton,UILabel等 loadView 中 createFields 接受参数,初始化变量 create ...

  2. iOS UIViewController生命周期控制

    具体流程,看下图: init方法在init方法中实例化必要的对象(遵从LazyLoad思想)init方法中初始化ViewController本身 loadView方法当view需要被展示而它却是nil ...

  3. initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏

    当我们创建或者自定义一个UI控件时,就很可能会调用awakeFromNib.initWithCoder .initWithFrame这些方法.三者的具体区别如下: initWithFrame: 通过代 ...

  4. iOS对UIViewController生命周期和属性方法的解析

    目录[-] iOS对UIViewController生命周期和属性方法的解析 一.引言 二.UIViewController的生命周期 三.从storyBoard加载UIViewController实 ...

  5. 【iOS开发】iOS对UIViewController生命周期和属性方法的解析

    iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有 ...

  6. UIViewController生命周期

    UIViewController生命周期

  7. 你真的了解UIViewController生命周期吗?

    一:首先了解一下生命周期图 二:UIViewController 生命周期介绍 1.通过alloc init 分配内存,初始化controller. 2.loadView loadView方法默认实现 ...

  8. Vue.js 子组件的异步加载及其生命周期控制

    前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心.这其中不得不提到 Vue.js 这个专注于 VM 层的框架. 本文主要对 Vue.js 组件化开发 ...

  9. Newbe.Claptrap 框架如何实现多级生命周期控制?

    Newbe.Claptrap 框架如何实现多级生命周期控制?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Lifetime Scope. 特别感谢 kotone 为本文提供的校对建议 ...

随机推荐

  1. HDU 4474 Yet Another Multiple Problem BFS

    题意:求m的倍数中不包含一些数码的最小倍数数码是多少.比如15 ,不包含0  1 3,答案是45. BFS过程:用b[]记录可用的数码.设一棵树,树根为-1.树根的孩子是所有可用的数码,孩子的孩子也是 ...

  2. 拖入浏览器读取文件demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Android环境的搭建遇到的问题和解决方案

    安卓环境的搭建,我花了将近一天的时间,在最后终于找到了一个比较好的方案. 第一个问题是安卓的官网(http://developer.android.com)很难登录.SDK和ADT都是需要在官网上下载 ...

  4. 使用CMD建立指定格式的文件

    一.建立空文件的几种方法1.cd.>a.txtcd.表示改变当前目录为当前目录,即等于没改变:而且此命令不会有输出.>表示把命令输出写入到文件.后面跟着a.txt,就表示写入到a.txt. ...

  5. Windows Live Writer 历史Blog修改的功能

    其实 WLW 有历史Blog修改的功能,我只是一直没有找到,就在打开“最近发布的日志”里面, 位于屏幕的右侧“打开”列表下. 最近发现记忆力越来越差了,BLOG看来是必须的了.

  6. Java+selenium+Firefox/ IE/ Chrome主流浏览器自动化环境搭建

    一.java+selenium+firefox 1.环境准备:JDK1.8 2.安装firefox浏览器v59 3.下载驱动:https://github.com/mozilla/geckodrive ...

  7. webpack核心提炼

    基本是学习的时候在网上整理的资料,并非自己原创,这篇文章的的主要目的是记录webpack.config.js的配置方式.可能也有不少错误,欢迎指正!! 一.应用场景 前端模块化开发.功能拓展.css预 ...

  8. html表单练习(讲义中的方法)

    用table作框体固定位置结构 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...

  9. [51Nod1446] 限制价值树 (容斥+MT定理+折半搜索)

    传送门 Description 有N个点(N<=40)标记为0,1,2,...N-1,每个点i有个价值val[i],如果val[i]=-1那么这个点被定义为bad,否则如果val[i] > ...

  10. 关于虚拟机中克隆的linux为什么不能开启网络服务

    将centos克隆了一份,启动后并配置好文件,发现网络服务中只有lo(loopback),而网卡(eth0)没有启动,一开始以为是通信模式(bridged,NAT,host-only)的选择问题,最后 ...