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
时间: 2024-09-29 02:15:01

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

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

从网上各位iOS们收集并总结: 各方法使用: init 中初始化一些UI组件,比如UIButton,UILabel等 loadView 中 createFields 接受参数,初始化变量 createViews 创建视图 createEvents 绑定事件,如按钮的点击,NotificationCenter,kvo等 viewDidLoad loadData 加载数据,调用一些api dealloc(现在dealloc中做的事我放在了viewDidDisapper中) destroyEvents

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

当我们创建或者自定义一个UI控件时,就很可能会调用awakeFromNib.initWithCoder .initWithFrame这些方法.三者的具体区别如下: initWithFrame: 通过代码创建UI控件的时候就会调用: initWithCoder:从文件中解析一个对象的时候就会调用这个方法,也就是说无论是通过代码还是xib,程序运行的时候都会调用这个方法: awakeFromNib:当一个对象从xib或者storyboard中加载完毕后,就会调用一次. 比如:当苹果官方提供的按钮不能

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

目录[-] iOS对UIViewController生命周期和属性方法的解析 一.引言 二.UIViewController的生命周期 三.从storyBoard加载UIViewController实例的传值陷阱 四.UIViewController与StroyBoard的相关相互方法 1.ViewController直接在StoryBoard中进行跳转的传值 2.使用代码跳转Storyboard中的controller 五.UIViewController之间的一些从属关系 1.parentV

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

iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有条有理的展示在我们的View层上.iOS中的UIViewController是UIKit框架中最基本的一个类.从第一个UI视图到复杂完整项目,都离不开UIViewController作为基础.基于UIViewController的封装和扩展,也能够出色的完成各种复杂界面逻辑.这篇博客,旨在讨论UIV

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

一:首先了解一下生命周期图 二:UIViewController 生命周期介绍 1.通过alloc init 分配内存,初始化controller. 2.loadView loadView方法默认实现[super loadView] 如果在初始化controller时指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件,如果没传xib文件名,默认会加载跟controller同名的xib文件,如果没找到相关联的xib文件,就会创建一个空白的UIView,然后赋給controller的

RxJava 和 RxAndroid 三(生命周期控制和内存优化)

RxJava 和 RxAndroid 三(生命周期控制和内存优化) rxjava rxandroid 前言:对Rxjava.Rxandroid不了解的同学可以先看看 RxJava 和 RxAndroid RxJava 和 RxAndroidRxJava 和 RxAndroid 二(操作符的使用) RxJava使我们很方便的使用链式编程,代码看起来既简洁又优雅.但是RxJava使用起来也是有副作用的,使用的越来越多的订阅,内存开销也会变得很大,稍不留神就会出现内存溢出的情况,这篇文章就是介绍Rxj

浅谈UIViewController生命周期

UIViewController是IOS中顶层视图的载体和控制器,用户与程序界面的交互都是由UIViewController来控制的,UIViewController管理UIView的生命周期及资源的加载与释放. 我们创建一个简单的demo来测试一下其生命周期,新建两个ViewController,一个是A页面,一个是B页面.A页面有个按钮可以跳转到B页面,并且在每个ViewController的每个方法中都添加了NSLog来打印其状态.截取AViewController.m部分代码如下,  #

【iOS】UIViewController生命周期

UIViewController有2周期: 在UIViewController中,View存在两个循环:载入循环和卸载循环. 载入循环 1>程序请求controller的view. 2>假设view在内存中,则直接载入.相反,假设不存在.则UIViewController调用loadView方法. 3>loadView方法运行例如以下操作: 假设你重载了这种方法,则必须创建必要的view而且将一个非nil值传给UIViewController的view属性. 假设你没有重载这个函数,UI

【分享】UIViewController生命周期简单归纳

一.调用顺序: 1. + (id)alloc 分配内存: 2. - (id)init 方法(包括其他-(id)init...方法),只允许调用一次,并且要与 alloc方法 写在一起,在init方法中申请的内存,要在dealloc方法中释放(或者其他地方): 3. - (void)awakeFromNib 使用Xib初始化后会调用此方法,一般不会重写此方法: 4. - (void)loadView 如果使用Xib创建ViewController,就不要重写该方法.一般不会修改此方法: 5. -