Method swizzling
2016-06-22 17:13
302 查看
“函数替换”这个网上很多很多的教程了,可以自行搜索,贴上比较好的教程:
http://www.cocoachina.com/industry/20140225/7880.html
利用一些技巧:
例如,调用的时候也可以用runtime的objc_msgSend来发消息。
可以在NSObject类方法的 load 或者 initialize 方法加GCD的单次执行来只实现一次
有时候会遇到Swizzling失效的坑爹情况,除了基本的语法出错,还要注意一点,如下:
这一段代码是NSHipster的标准例子,但是有时候会调用失效,看看这个大哥怎么调用的: https://spin.atomicobject.com/2014/12/30/method-swizzling-objective-c/
很明显,直接交换实现,就可以解决了,如下:
还有一些好的文章可以看看:
https://blog.newrelic.com/2014/04/16/right-way-to-swizzle/
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); }
这一段代码是NSHipster的标准例子,但是有时候会调用失效,看看这个大哥怎么调用的: 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/
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- iOS App开发中的UISegmentedControl分段组件用法总结
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- iOS中UIAlertView警告框组件的使用教程
- 浅析iOS应用开发中线程间的通信与线程安全问题
- iOS中的UIKeyboard键盘视图使用方法小结
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法