Method swizzling
来源:互联网 发布:淘宝退货卖家拖延时间 编辑:程序博客网 时间:2024/05/21 17:24
“函数替换”这个网上很多很多的教程了,可以自行搜索,贴上比较好的教程:
http://www.cocoachina.com/industry/20140225/7880.html
利用一些技巧:
例如,调用的时候也可以用runtime的objc_msgSend来发消息。
可以在NSObject类方法的 load 或者 initialize 方法加GCD的单次执行来只实现一次
有时候会遇到Swizzling失效的坑爹情况,除了基本的语法出错,还要注意一点,如下:
Class class = [self class]; NSLog(@"Hooked with ReYunChannel Class : %@", NSStringFromClass(class)); SEL originalSelector = @selector(initWithappKey:withChannelId:); SEL swizzledSelector = @selector(swizzledInitWithAppId:channelID:); Method originalMethod = class_getClassMethod(class, originalSelector); Method swizzledMethod = class_getClassMethod(class, swizzledSelector); BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); }
https://spin.atomicobject.com/2014/12/30/method-swizzling-objective-c/
很明显,直接交换实现,就可以解决了,如下:
Class class = [self class]; NSLog(@"Hooked with ReYunChannel Class : %@", NSStringFromClass(class)); SEL originalSelector = @selector(initWithappKey:withChannelId:); SEL swizzledSelector = @selector(swizzledInitWithAppId:channelID:); Method originalMethod = class_getClassMethod(class, originalSelector); Method swizzledMethod = class_getClassMethod(class, swizzledSelector); BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { method_exchangeImplementations(originalMethod, swizzledMethod); }
还有一些好的文章可以看看:
https://blog.newrelic.com/2014/04/16/right-way-to-swizzle/
0 0
- Method Swizzling
- Method Swizzling
- Method Swizzling
- Method Swizzling
- Method Swizzling
- Method Swizzling
- Method Swizzling
- Method Swizzling
- method swizzling
- Method Swizzling
- Method Swizzling
- Method Swizzling
- Method Swizzling
- Method Swizzling
- Method Swizzling
- Method Swizzling
- Method Swizzling
- Method swizzling
- Scrum到底怎么玩儿?
- 零碎知识笔记
- Ubuntu 16 安装php 5.5 的方法
- Codeforces 682C C. Alyona and the Tree (DFS)
- 线性表的删除及查找定位删除(完整程序)
- Method swizzling
- 日常小结-xml编程(CRUD)
- iOS CocoaPods 的安装流程
- Android 实现沉浸式状态栏效果(systembartint库)
- 第一次盲打测试
- GestureDetector_SimpleOnGestureListener
- 边做边学Python Flask Web开发(4)-- 使用Jinjia2模板(上)
- iOS 图片保存到本地相册
- ACTIVEX控件加载上了但没作用