iOS runtime实用篇:让你快速上手一个项目

前言:编程

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

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

思考

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

思路

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

1594675-6d84eb99316876a7.png

 

解决方案

  • 方案1code

    • 整个项目中创建一个基类的viewController,而后将项目中全部的viewController都继承于基类的viewController,而后重写基类中的viewWillAppear方法blog

- (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继承的类都改为基类吧?这工程量太大,太麻烦。get

  • 方案2 不管是从零开始搭建的项目,仍是已经成型的项目,方案2都适用。

 

 

原文:http://www.jianshu.com/p/78efcc9575b7

相关文章
相关标签/搜索