UIViewController生命周期控制
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生命周期控制的更多相关文章
- UIViewController生命周期控制-开发规范
从网上各位iOS们收集并总结: 各方法使用: init 中初始化一些UI组件,比如UIButton,UILabel等 loadView 中 createFields 接受参数,初始化变量 create ...
- iOS UIViewController生命周期控制
具体流程,看下图: init方法在init方法中实例化必要的对象(遵从LazyLoad思想)init方法中初始化ViewController本身 loadView方法当view需要被展示而它却是nil ...
- initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏
当我们创建或者自定义一个UI控件时,就很可能会调用awakeFromNib.initWithCoder .initWithFrame这些方法.三者的具体区别如下: initWithFrame: 通过代 ...
- iOS对UIViewController生命周期和属性方法的解析
目录[-] iOS对UIViewController生命周期和属性方法的解析 一.引言 二.UIViewController的生命周期 三.从storyBoard加载UIViewController实 ...
- 【iOS开发】iOS对UIViewController生命周期和属性方法的解析
iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有 ...
- UIViewController生命周期
UIViewController生命周期
- 你真的了解UIViewController生命周期吗?
一:首先了解一下生命周期图 二:UIViewController 生命周期介绍 1.通过alloc init 分配内存,初始化controller. 2.loadView loadView方法默认实现 ...
- Vue.js 子组件的异步加载及其生命周期控制
前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心.这其中不得不提到 Vue.js 这个专注于 VM 层的框架. 本文主要对 Vue.js 组件化开发 ...
- Newbe.Claptrap 框架如何实现多级生命周期控制?
Newbe.Claptrap 框架如何实现多级生命周期控制?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Lifetime Scope. 特别感谢 kotone 为本文提供的校对建议 ...
随机推荐
- ACM_名字的价值
名字的价值 Time Limit: 2000/1000ms (Java/Others) Problem Description: 集训终于开始了,参加集训的人很多,也就有很多名字,集训组织者发现了一件 ...
- C - Anton and Danik
Problem description Anton likes to play chess, and so does his friend Danik. Once they have played n ...
- Struts2 在登录拦截器中对ajax请求的处理
前言: 由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串. 之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后 ...
- python--3、函数
定义: 定义函数时,也相当于定义变量.会把函数体内的代码存入开辟的内存空间中.使用函数时,通过func() 声明是函数,其对应的值为代码.函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执 ...
- VM虚拟机中Ubuntu中执行apt-get update失败的解决方法(可能有效)
首先确保虚拟机是连接网络的,可以用ping命令检测一下看是否连通网络.采用nat网络的时候确保服务是开的. 如果之前执行过apt-get update命令但是失败了,执行一下 rm -rf ...
- Pull-up resistors
1 Introduction Pull-up resistors are very common in microcontrollers or any digital logic device. Wi ...
- (转)Arcgis for Js之GeometryService实现测量距离和面积
http://blog.csdn.net/gisshixisheng/article/details/40540601 距离和面积的测量时GIS常见的功能,在本节,讲述的是通过GeometryServ ...
- POJ_1061_扩展欧几里德
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 107027 Accepted: 21321 Descript ...
- 算法87-----DAG有向无环图的拓扑排序
一.题目:课程排表---210 课程表上有一些课,是必须有修学分的先后顺序的,必须要求在上完某些课的情况下才能上下一门.问是否有方案修完所有的课程?如果有的话请返回其中一个符合要求的路径,否则返回[] ...
- 15.5.1【Task实现细节】 生成的代码
还在吗?我们开始吧.由于深入讲解需上百页的篇幅,因此这里我不会讲得太深.但我会提 供足够的背景知识,以有助于你对整个结构的理解.之后可通过阅读我近些年来撰写的博客文章, 来了解更加错综复杂的细节,或简 ...