您的位置:首页 > 其它

runtime实际应用(2)- 快速上手一个项目

2017-11-17 17:35 253 查看
前言

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

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


思考

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


思路

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




解决方案

方案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都适用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: