iOS黑魔法之Method Swizzling

本文详细介绍了Objective-C中的Method Swizzling技术,这是一种基于Runtime的方法替换技术,允许开发者将现有方法替换成自定义方法,实现方法Hook的目的。文章通过具体实例展示了如何在UIViewController中替换viewWillAppear方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此黑魔法本应属于OC,它是基于Runtime实现的偷天换日大法。

那么什么是Method Swizzling呢?从字面意思来看叫方法协调,大概就是这个意思了。使用此魔法可以替换现有方法为自定义方法,来个偷天换日,偷梁换柱。

使用方法很简单,代码基本为以下框架。但其具有较强的魔力,这是一个方法hook啊。

/**
 *  Method Swizzling
 *  黑魔法之偷天换日
 */
#import "UIViewController+Extension.h"
#import <objc/runtime.h>

@implementation UIViewController (Extension)

// 为了保证一定执行 把代码放到+ (void)load;里
+ (void)load {
    [super load];
    // 线程安全 只执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 获取class
        Class class = [self class];
//        Class class = object_getClass((id)self);
        // 封装selector
        SEL originalSelector = @selector(viewWillAppear:);
        SEL swizzledSelector = @selector(lw_viewWillAppear:);
        // 封装方法
        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
        // 添加方法
        BOOL methodDidAdd = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
        if(methodDidAdd) {
            // 替换方法
            class_replaceMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
        }else {
            // 交换方法
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

#pragma mark - 自定义的魔法方法
- (void)lw_viewWillAppear:(BOOL)animated {
    [self lw_viewWillAppear:animated];
    NSLog(@"BLack Magic");
}

注意:

1 + (void)load;

2 dispatch_once;

3 [self lw_viewWillAppear:animated]; // 不回死循环 若为[self viewWillAppear:animated];死循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬味的黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值