前言:编程
对于一个大项目而言,最烦恼的就是在众多界面难以找到对应的viewController,要改个东西都要花好长的时间去找对应的类。架构
特别是当你接手一个大项目的时候,对总体的业务逻辑不熟悉,总体的架构体系不熟悉,让你修复某个页面的BUG,估计你找这个页面所对应的viewController都要找很久。app
可否有一种方式能够快速让你上手一个大项目?快速找到某个页面所对应的viewController ?spa
在每个页面出现的时候,都打印出哪一个类即将出现,以下图所示日志
方案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