zoukankan      html  css  js  c++  java
  • Runtime

    前言:
    • 对于一个大项目而言,最烦恼的就是在众多界面难以找到对应的viewController,要改个东西都要花好长的时间去找对应的类。

    • 特别是当你接手一个大项目的时候,对整体的业务逻辑不熟悉,整体的架构体系不熟悉,让你修复某个页面的BUG,估计你找这个页面所对应的viewController都要找好久。


    思考

    • 能否有一种方式可以快速让你上手一个大项目?快速找到某个页面所对应的viewController ?


    思路

    • 在每一个页面出现的时候,都打印出哪个类即将出现,如下图所示

    1594675-6d84eb99316876a7.png


    解决方案

    • 方案1

      • 整个项目中建立一个基类的viewController,然后将项目中所有的viewController都继承于基类的viewController,然后重写基类中的viewWillAppear方法

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        NSString *className = NSStringFromClass([self class]);
        NSLog(@"%@ will appear", className);
    }
    
    

    • 方案2

      • 给UIViewContoller建立一个分类,在分类里进行方法的交换,既保留了原本的方法,又有打印信息

    //
    //  UIViewController+Swizzling.m
    //  CollectionsOfExample
    //
    //  Created by mac on 16/10/1.
    //  Copyright ? 2016年 chenfanfang. All rights reserved.
    //
    
    #import "UIViewController+Swizzling.h"
    
    #import @implementation UIViewController (Swizzling)
    
    + (void)load {
    
        //我们只有在开发的时候才需要查看哪个viewController将出现
        //所以在release模式下就没必要进行方法的交换
    #ifdef DEBUG
    
        //原本的viewWillAppear方法
        Method viewWillAppear = class_getInstanceMethod(self, @selector(viewWillAppear:));
    
        //需要替换成 能够输出日志的viewWillAppear
        Method logViewWillAppear = class_getInstanceMethod(self, @selector(logViewWillAppear:));
    
        //两方法进行交换
        method_exchangeImplementations(viewWillAppear, logViewWillAppear);
    
    #endif
    
    }
    
    - (void)logViewWillAppear:(BOOL)animated {
    
        NSString *className = NSStringFromClass([self class]);
    
        //在这里,你可以进行过滤操作,指定哪些viewController需要打印,哪些不需要打印
        if ([className hasPrefix:@"UI"] == NO) {
            NSLog(@"%@ will appear",className);
        }
    
    
        //下面方法的调用,其实是调用viewWillAppear
        [self logViewWillAppear:animated];
    }
    
    @end
    
    

    优缺点分析

    • 方案1  适用于一个新项目,从零开始搭建的项目,建立一个基类controller,这种编程思想非常可取。但对于一个已经成型的项目,则方案一行不通,你总不能建议一个基类,让后将所有的controller继承的类都改成基类吧?这工程量太大,太麻烦。

    • 方案2 不论是从零开始搭建的项目,还是已经成型的项目,方案2都适用。
  • 相关阅读:
    对协程的一些理解
    JUC中Lock和ReentrantLock介绍及源码解析
    JUC中AQS简介
    Executor框架简介
    CyclicBarrier简介
    CountDownLatch简介
    Semaphore简介
    ThreadPoolExecutor简介
    AtomicInteger简介
    synchronized和volatile简介
  • 原文地址:https://www.cnblogs.com/xsyl/p/6085888.html
Copyright © 2011-2022 走看看