Runtime相关

1. 当接手一个比较大的项目时,利用method Swizzle (方法交换),来快速熟悉项目,从控制台输出当前控制器的名称
  • 创建 UIViewcontroller 的一个分类
  • 引入头文件 #import <objc/runtime.h>
  • 在load方法中将自定义的logViewWillAppear方法与系统的viewWillAppear 方法进行交换
+ (void)load {
    
    //我们只有在开发的时候才需要查看哪个viewController将出现
    //所以在release模式下就没必要进行方法的交换
#ifdef DEBUG
    
    //原本的viewWillAppear方法
    Method viewDidAppear = class_getInstanceMethod(self, @selector(viewDidAppear:));
    
    //需要替换成 能够输出日志的viewWillAppear
    Method logViewWillAppear = class_getInstanceMethod(self, @selector(logViewWillAppear:));
    
    //两方法进行交换
    method_exchangeImplementations(viewDidAppear, logViewWillAppear);
    
#endif

}
  • 自定义logViewWillAppear
- (void)logViewWillAppear:(BOOL)animated {
    
    NSString *className = NSStringFromClass([self class]);
    
    //在这里,你可以进行过滤操作,指定哪些viewController需要打印,哪些不需要打印
//    if ([className hasPrefix:@"UI"] == NO) {
//        NSLog(@"%@ will appear",className);
//    }
    NSLog(@"currentControllerName = %@",className);
    //下面方法的调用,其实是调用viewWillAppear
    [self logViewWillAppear:animated];
}
  • 将分类文件直接拖入项目即可使用
2. 利用关联对象为分类添加属性
  • 分类中添加属性
@interface Person (name)
@property(nonatomic,strong)NSString *name;
@end
  • 利用关联对象进行绑定
-(NSString *)name{
    return objc_getAssociatedObject(self, @"name");
    
}
-(void)setName:(NSString *)name{
    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,408评论 19 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,831评论 0 9
  • 导语 在经历了用NSLog来记录日志的写法后,我意识到一个问题,如果当你在项目里想要用NSLog输出一个当时你想要...
    掉了西红柿皮_Kee阅读 3,064评论 0 2
  • 修改系统方法 动态添加方法 动态给系统类添加属性(给分类添加属性) runtime+kvc 转换模型
    Vijay_阅读 806评论 0 0
  • 本篇涵盖runtime的解析、应用等. 1.runtime快速入门和实战2.Runtime 10种用法(没有比这更...
    守护地中海的花阅读 1,215评论 0 0