JRSwizzle 是一个源代码包,它提供了一种简单、正确、一致的接口,用于在许多版本的 Mac OS X、iOS、Objective-C 和运行时架构之间交换 Objective-C 方法实现(“方法交换”)。
更简洁地说: JRSwizzle 想成为您所有方法交换需求的一站式商店。
$ cd /path/to/top/of/your/project
$ git submodule add git://github.com/rentzsch/jrswizzle.git JRSwizzle semver-1.x
$ git submodule init && git submodule update
# OPTIONAL: Execute the following commands if you want to explicitly peg
# to a certain version. Otherwise `git submodule update` will keep you
# current with HEAD.
$ cd JRSwizzle
$ git checkout v1.0
[SomeClass jr_swizzle:@selector(foo) withMethod:@selector(my_foo) error:&error];
立竿见影。NSError
可选对象。请使用 JRSwizzle 的 GitHub 问题选项卡来报告错误或功能请求。
要做出贡献,请分叉此项目,提交您的更改,然后向我发送拉取请求。
至少有四种交换实现流传。以下是比较表,以帮助您理解它们如何相互关联以及为什么存在 JRSwizzle。
场景 | 交换技术 | 方法实现 | 正确行为 | 10.4 | 64 位 |
---|---|---|---|---|---|
1 | 经典 | 直接 | 是 | 是 | 否 |
2 | 经典 | 继承的 | 否 | 是 | 否 |
3 | Ballard | 直接 | 是 | 是 | 否 |
4 | Ballard | 继承的 | 是 | 是 | 否 |
5 | Apple | 直接 | 是 | 否 | 是 |
6 | Apple | 继承的 | 否 | 否 | 是 |
7 | JRSwizzle | 直接 | 是 | 是 | 是 |
8 | JRSwizzle | 继承的 | 是 | 是 | 是 |
MethodSwizzle()
的规范实现。method_exchangeImplementations
API。源代码是在非病毒性的 MIT 许可证下分发的。这是最简单、最自由的许可证之一。
v1.0: 2012 年 3 月 2 日
[新增] 支持 iOS. (Anton Serebryakov)
[新增] 类方法交换. (outis)
v1.0d1: 2009 年 5 月 31 日
[修复] 通过将 hoisted_method_list->obsolete
设置为 NULL,缓解了 valgrind 的读取问题。 (Daniel Jalkut)
[修复] Xcode 3.2 现在似乎需要为 10.3 目标显式设置 ARCHS
。 (rentzsch)
v1.0d0: 2009 年 4 月 9 日
v1.0d0: 2007 年 12 月 28 日