zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    BeforeFieldInit解析(zz)
    自定义控件
    How to make Office VBA code interact with a VSTO applicationlevel addin
    总结
    IL汇编语言程序设计目录
    zz如何精简用户界面
    volatile关键字的作用(zz)
    外企面试基本涵盖了所有问题(拿得别人的,很有用)
    Excel 2007 There was a problem sending the command to the program
    数据库技巧
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6939696.html
Copyright © 2011-2022 走看看