参考https://www.jianshu.com/p/19c5736c5d9a,

http://blog.sina.com.cn/s/blog_a343f32b0101en4o.html

runtime的Method Swizzling确实很方便,动态交换方法,所谓就是黑科技.其实就是C语言的Hook原理所谓的钩子.

但是如果滥用,尤其是多个开发人员开发,就有可能造成坑.其中RSSwizzle,ASPect就是能解决这个风险,只是代码风格写的确实和其他的不一样,可以参考上面的这个链接,我实验过,确实是会没有把父类Person的p_sayHello给Hook到,这是因为OC里面父类+load会比子类先执行,但是如果父类的类别的(Person+swizzle),子类的类别(Student+swizzle)的加载,取决于编译的顺序,也就是有可能子类的类别先执行,父类的类别从而没有执行,这里的原因可能是子类的方法优先级还是高于父类的方法,这其实也是类别的原理吧.

看完上面的链接,我们要思考几个问题:

1.如果我们交换的是系统的方法,那么系统的IMP会不会有处理,这个我暂时还没有研究,但是我们可能想到的是,有可能会把父类的方法给Hook掉,会让我们莫名其妙的找不到原因.

2.我们在用到Method swizzling的时候,首先+load方法,dispatch_once确保首次,写法前面有.

有关 Method Swizzling的陷阱

Method Swizzling  is not atomic

使用method swizzling实现的方法在并发使用时基本都是安全的。也就是把修改方法实现的操作放在+load里,并在应用程序一开始就调用执行,你将不会碰到并发问题,如果你在+(void)initialize初始化里面进行swizzlw,就有问题.

change behavior of un-owned code

大多数情况下,父类方法期望被调用,如果你在swizzling实现中也这样做了,这会避免大部分问题。还是调用原始实现吧。

possible naming conflicts 命名冲突

多个有继承关系的类的对象swizzle时,先从父对象开始。这样才能保证子类方法拿到父类中的被swizzle的实现。在+(void)load中swizzle不会出错,就是因为load类方法会默认从父类开始调用.

iOS总结-Runtime篇之黑魔法Method Swizzling的滥用会有危险吗相关推荐

  1. iOS总结-Runtime篇之用途及面试题的总结一黑魔法Method Swizzling

    runtime的用途基本分下面几类: 实现多继承Multiple Inheritance 上一篇里面的最后利用methodSignatureForSelector来进行一次转发,在forwardInv ...

  2. iOS黑魔法--Method Swizzling

    参考链接: iOS黑魔法-Method Swizzling iOS 黑魔法 - 专题 - 简书 Method Swizzle黑魔法,修改 ios 系统类库方法

  3. iOS 开发:『Runtime』详解(二)Method Swizzling

    本文用来介绍 iOS 开发中『Runtime』中的黑魔法Method Swizzling. 通过本文,您将了解到: Method Swizzling(动态方法交换)简介 Method Swizzlin ...

  4. 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入

    概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为" ...

  5. runtime实践之Method Swizzling

    利用 Objective-C 的 Runtime 特性,我们可以给语言做扩展,帮助解决项目开发中的一些设计和技术问题.这一篇,我们来探索一些利用 Objective-C Runtime 的黑色技巧.这 ...

  6. Objective-C Runtime 运行时之四:Method Swizzling

    理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Me ...

  7. Objective-C Runtime (三):Method Swizzling(方法替换)

    Objective-C Runtime (三):Method Swizzling(方法替换) Method Swizzling是一种改变改变一个'selector'的实际实现的技术.通过这一技术,我们 ...

  8. runtime(四) method swizzling 与AOP编程

    什么是 AOP : (site: baike.baidu.com),引用百度百科中的解释就是: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过 ...

  9. 关于Swift4.0 Method Swizzling(iOS的hook机制)使用

    2019独角兽企业重金招聘Python工程师标准>>> 关于Method Swizzling 原理什么的有很多帖子讲述的已经很清楚这里不再赘述, 这里仅仅处理Method Swizz ...

最新文章

  1. 五彩进化树与热图更配-ggtree美颜进化树(宏基因组扩增子)
  2. Linux Kernel TCP/IP Stack — L2 Layer — Linux VLAN device for 802.1.q(虚拟局域网)
  3. 计算机5G英语文献,无线通信英文参考文献精选
  4. SAP ME1M如何以ALV形式显示(鹦鹉学舌篇)
  5. 字节跳动 Flink 单点恢复功能实践
  6. mysql不支持innodb存储引擎
  7. 【社交分享SDK】ShareSDK for Android 2.5.9已经公布
  8. better-scroll使用的坑与心得
  9. dev cpp的常用快捷键
  10. svn 合并分支 (svn操作手册)
  11. 用mysql语句备份_MySql常用备份及恢复语句
  12. 【保姆级】-spotfire服务端、客户端安装部署(V7.8)
  13. 来!PyFlink 作业的多种部署模式
  14. 制作u盘winpe启动盘_重装系统——制作U盘启动盘
  15. windows恶意软件删除工具 MRT.EXE
  16. Removing unused resources requires unused code shrinking to be turned on 解决
  17. win10 蓝牙忽然消失,设备管理器有未知USB设备描述符请求失败
  18. 管廊复杂网格参数化算法及其大数据在线渲染
  19. 摩斯电码php源码,PHP实现基于文本的摩斯电码生成器
  20. 使用svn(subversion)的一个注意点

热门文章

  1. Linux系统安装教程(非双系统/虚拟机安装教程)
  2. linux – Docker:无法添加对接口(不支持操作)
  3. 登录GITHUB:Open your two-factor authenticator (TOTP) app or browser extension to view your authenticat
  4. 高性能计算基准测试程序(二)--MPI测试基准
  5. 哪些软件是用C++写的
  6. springboot+Thymeleaf生成PDF
  7. GIS:不同基准面坐标系转换
  8. Visual C++ 2010如何解决程序运行闪退问题
  9. 2022年的电视评判标准,为何还要强调画质?
  10. APP产品经理必须要懂的30条原则——来自腾讯张小龙的演讲