Gocy's home page

把热爱的事情做好

0%

转载请注明出处。

如果你是一名 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 这样的方法又是如何找到函数指针的呢?

阅读全文 »

前言

在 iOS 上,对某个 view 进行“图片化”操作似乎已经是家常便饭了。而不论是 [CALayer renderInContext:] 还是 [UIView drawViewHierarchyInRect:afterScreenUpdates:] 都有各自的 bug 和局限性。本文将根据实际开发中遇到的问题,着重探讨 [UIView drawViewHierarchyInRect:afterScreenUpdates:] 方法。

阅读全文 »

最近在用 Swift 开发一个有记录文件目录层级功能的 command line,顺便学习一下 Swift4 的新特性,而开发过程中遇到了有关于泛型和协议的一些问题,经过探索后写下本文进行记录。

阅读全文 »

这种文章都是以“转眼”开头的不是吗?转眼 2017 也悄悄过去了,成长是今年的关键词。

阅读全文 »

前言

转眼又年尾了,JS 都忘的差不多了 :( 。

本文是 iOS 程序员的 JavaScript 之旅 系列的第四篇,这个系列主要用于记录我在学习 JavaScript 中的一点心得,文中内容由于参考文献版本不一定是最新 & 个人理解水平有限,可能出现一些错误,还请谅解。如果有任何讨论 / 建议 / 意见,欢迎评论留言或是邮件联系。

阅读全文 »