UIViewController_Swizzled的原理和使用

实现的功能:
  可用于跟踪复杂程序的一个非常简单的类库源码,查看每个viewController的层级嵌套顺序,显示一个UIViewController的时候日志记录一下。
原理:
  置换 UIViewController 的 viewDidAppear: 方法
  Objecitve-C的重要特性是Runtime(运行时),在Interacting with the Runtime(交互运行)中,运行时函数部分,苹果给出了/usr/lib/libobjc.A.dylib库,这个共享库提供支持动态属性的objective - c语言,通过其接口,可以用于开发将其他语言运行于Objective-C上的中间层(桥接层),库里的函数定义为纯C语言。
  其中#import

 <objc/runtime.h>

  运行时确认函数用于动态调用,代码中:

+(void)load
{
    isSwizzed = NO;
}

  一般情况下,类别里的方法会重写掉主类里相同命名的方法。如果有两个类别实现了相同命名的方法,只有一个方法会被调用。但 +load: 是个特例,当一个类被读到内存的时候, runtime 会给这个类及它的每一个类别都发送一个 +load: 消息。

-(void)swizzviewDidAppear:(BOOL)animated
{
    [self printPath];
    // Call the original method (viewWillAppear)
    [self swizzviewDidAppear:animated];
}

  代码看起来可能有点奇怪,像递归不是么。当然不会是递归,因为在 runtime 的时候,函数实现已经被交换了。调用 viewDidAppear: 会调用你实现的 swizzled_viewDidAppear:,而在 swizzled_viewDidAppear: 里调用 swizzled_viewDidAppear: 实际上调用的是原来的 viewDidAppear: 所以效果就是viewDidAppear的调用会先执行swizzviewDidAppear,再执行swizzviewDidAppear里的swizzviewDidAppear(也就是原来viewDidAppear里实现的代码)

  函数替换

  • class_getInstanceMethod
  • class_addMethod
  • class_replaceMethod

使用步骤:
  1、从github下载UIViewController-Swizzled,可以cocopad,也可以直接add进项目。
  2、直接在.pch文件#import <UIViewController+Swizzled.h>,这样所有的controller都包含了这个头文件。
  3、在AppDelegate.m的didFinishLaunchingWithOptions方法中,调用宏SWIZZ_IT_WITH_TAG(LOGTAG)或者SWIZZ_IT。
  

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    SWIZZ_IT_WITH_TAG(LOGTAG);
    return YES;
}

源码地址:https://github.com/RuiAAPeres/UIViewController-Swizzled

Objective-C 的运行时中最具争议的黑魔法:method swizzling:http://www.cocoachina.com/ios/20160121/15076.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值