Objective-C 运行时的黑魔法之Swizzle
这篇讲的是Objective-C运行时里一项既强大又颇具风险的特性:Swizzle(方法交换)。作者从一个实际需求切入——如何在不改动项目原有代码结构的前提下,为应用中成百上千个UIButton的点击事件统一添加统计逻辑。 文章清晰地揭示了Swizzle的原理:Objective-C在调用方法时,依赖类的“调度表”通过selector查找对应的实现。我们可以在运行时替换这个映射关系,从而“偷天换日”。相比于创建子类或逐处修改代码的传统思路,这无疑是一劳永逸的“黑魔法”。 其核心实现也十分巧妙:通过`method_exchangeImplementations`交换两个selector对应的方法指针。文中以一段Swift示例代码具体展示了如何为UIButton扩展一个计数方法,并与原方法交换实现。最有趣的一点是,在替换方法中调用“自身”时,看似会死循环,实则因为实现已被交换,调用的恰是原始逻辑。 最后,文章还提醒了在Swift中应用Swizzle的注意事项,例如需要利用`initialize`方法触发交换,以及对纯Swift类需要使用`dynamic`修饰以启用动态派发。这既是一次对运行时机制的精彩剖析,也提供了解决特定工程难题的优雅范本。