iOS runtime实用篇

来源:互联网 发布:linux渗透有什么用 编辑:程序博客网 时间:2024/05/17 01:10

通常对于一个新接手的项目,我们会想知道哪页对应的是哪个VC,如果想实现点到页面就打印对应的类,会有以下两个方法。


方案1

  • 适用新项目 (基类)
    整个项目中建立一个基类的viewController,然后将项目中所有的viewController都继承于基类的viewController,然后重写基类中的viewWillAppear方法
- (void)viewWillAppear:(BOOL)animated {    [super viewWillAppear:animated];    NSString *className = NSStringFromClass([self class]);    NSLog(@"%@ will appear", className);}

方案2

  • 不论是从零开始搭建的项目,还是已经成型的项目,都适用。(runtime方法交换)
////  UIViewController+Swizzling.m//  RunTimeDemo////  Created by LXChen on 2017/5/17.//  Copyright © 2017年 LXChen. 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