2019年度总结
A year of change.
转载请注明出处。
如果你是一名 objective-c
开发者,那么相信你多多少少都接触过那神秘而危险的动态替换机制:Method Swizzling;当动态改变 oc 代码无法满足需求的时候,或许你还使用过 fishhook 或是其它用于动态 rebind c 函数的钩子库。在开源社区如此活跃的今天,对上述两种 hook 方法的原理和源码的分析可以说是面面俱到了。
本文并不分析这两种通用的钩子的实现方式,而是对准那一个让所有 oc 开发者魂牵梦绕的 c 方法:objc_msgSend
,我们来聊聊 hook 它所带来的问题,以及解决问题的方案。
阅读本文之前,你应该具备一定阅读汇编的能力,同时对函数调用时,栈空间的分配有一定的概念。
本文所有汇编代码基于 arm64。
在 Objective-C
的世界中,对对象的方法调用都会被转为消息发送,通过 self
和 _cmd
,在 method_list 中寻找对应的函数指针,最终触发函数调用。对于我们自己代码中的类,这很好理解,Runtime 会维护一个巨大的列表,存储着我们的类的信息。但对于系统 framework 中的类型呢?难道 Runtime 会在启动时预先将所有系统类也加载进来吗?更广义一点说,诸如 printf
这样的方法又是如何找到函数指针的呢?
分享一下如何在 Xcode 中创建快捷代码段,提升开发效率。
最近在用 Swift 开发一个有记录文件目录层级功能的 command line,顺便学习一下 Swift4 的新特性,而开发过程中遇到了有关于泛型和协议的一些问题,经过探索后写下本文进行记录。
转眼又年尾了,JS 都忘的差不多了 :( 。
本文是 iOS 程序员的 JavaScript 之旅 系列的第四篇,这个系列主要用于记录我在学习 JavaScript 中的一点心得,文中内容由于参考文献版本不一定是最新 & 个人理解水平有限,可能出现一些错误,还请谅解。如果有任何讨论 / 建议 / 意见,欢迎评论留言或是邮件联系。