如何使用Method Swizzle实现友盟统计

本文介绍了Objective-C中的MethodSwizzle技术,即方法混淆,通过指针交换来改变类的方法实现。并给出了一个友盟统计的实际应用案例,展示了如何利用JRSwizzle库过滤特定类的统计信息。

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

1.什么是Method Swizzle(黑魔法)

        从字面意思上看,就是方法混淆的意思。大家对它的理解性定义为:改变一个已存在的选择器对应的实现的过程,它依赖于Objectvie-C中方法的调用能够在运行时进改变——通过改变类的调度表(dispatch table)中选择器到最终函数间的映射关系。

        实际上它是通过指针调换的方式,将某个类的方法A对应的指针指向我们自己写的一个方法B,将我们自己写的方法B对应的指针指向方法A,看看下面图的图示:

   

2.友盟统计实例

       已下是实现友盟统计的具体实现,这里可以根据需求过滤掉一下类的统计

       这里用到一个已经比较成熟的第三方JRSwizzle,当然自己写也可以,没几行代码

#import "UIViewController+WJSwizzle.h"
#import "JRSwizzle.h"
#import "MobClick.h"

@implementation UIViewController (WJSwizzle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSError *err1 = nil,*err2 = nil;
        [self jr_swizzleMethod:@selector(viewDidAppear:)
                    withMethod:@selector(swizzle_viewDidAppear:)
                         error:&err1];
        [self jr_swizzleMethod:@selector(viewDidDisappear:)
                    withMethod:@selector(swizzle_viewDidDisappear:)
                         error:&err2];
        if (err1) NSLog(@"页面统计发生错误(%@):%@",
                        [self description], err1.localizedDescription);
        if (err2) NSLog(@"页面统计发生错误(%@):%@",
                        [self description], err2.localizedDescription);
    });
}

- (void)swizzle_viewDidAppear:(BOOL)animated {
    [MobClick beginLogPageView:[self.class description]];
    [self swizzle_viewDidAppear:animated];
}

- (void)swizzle_viewDidDisappear:(BOOL)animated {
    [MobClick endLogPageView:[self.class description]];
    [self swizzle_viewDidDisappear:animated];
}

@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值