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. iOS 点击事件传递及响应

    1.iOS中的事件 iOS中的事件可以分为3大类型: 触摸事件 加速计事件 远程控制事件这里我们只讨论iOS中的触摸事件. 1.1响应者对象(UIResponder) 在iOS中不是任何对象都能处理事 ...

  2. 小白写的一个ASP.NET分页控件,仅供娱乐

    无聊,第一次写博客,自己动手写了一个分页控件.由于我是新手,有很多地方写得不够好,希望各位大牛多多指正.哈哈哈 /// <summary> /// 分页控件 /// </summar ...

  3. Jquery 获取父页面下指定iframe里的指定元素

    var div1=$("#iframe1",window.parent.document).contents().find("#div1");

  4. 前端-Vue学习思维导图笔记

    看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记有vue结构分析,JS基础,JQ,JS高级,Angular,git等等

  5. Md2All,让公众号完美显示Latex数学公式

    当公众号遇上Latex 大家都知到,公众号连代码块都不支持,更不要说功能强大的Latex公式了.那在Md2All之前,如果想在公众号上显示Latex公式应该怎么办呢? 最通常的做法就是在某个支持Lat ...

  6. Ubuntu16下安装lamp

    1.安装php7 sudo apt-get install php7.0 php7.0-mcrypt 2.安装MySQL sudo apt-get install mysql-server 输入 su ...

  7. 简繁体互换工具:opencc

    简繁体互换工具:opencc opencc是一个简体.繁体相互转换的命令行工具. 安装 下载软件包.在下载页面下载软件包(如1.0.4版本) 解压.通过命令解压:tar -xzvf opencc-1. ...

  8. sql server like 在将值转换成数据类型int失败

    select * from table where title like '%'?'%'; 采用? 传参会报错:sql server like 在将值转换成数据类型int失败 select * fro ...

  9. Python基础知识-Day4

    一.函数关键字关键字是Python内置的,具有特殊意义的标识符,自定义标识符命名时不可与之重复.可以通过以下代码查看Python内置的关键字内容. import keyword print(keywo ...

  10. BZOJ 3319: 黑白树 树+并查集+未调完+神题

    Code: #include<bits/stdc++.h> #define maxn 1000003 using namespace std; char *p1,*p2,buf[10000 ...