JRSwizzle
描述
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
$ 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];
Voila。 - 正确:方法交换和方法继承之间存在微妙的交互。遵循Kevin Ballard的脚步,这个包会“做正确的事”。
- 兼容性:JRSwizzle应该在不关心任何版本的Mac OS X和iOS上都能正常工作。以下是完整的兼容性列表
- Mac OS X v10.3/ppc (Ballard实现)
- Mac OS X v10.4/ppc (Ballard实现)
- Mac OS X v10.4/i386 (Ballard实现)
- Mac OS X v10.5/ppc (method_exchangeImplementations+Ballard实现)
- Mac OS X v10.5/i386 (method_exchangeImplementations+Ballard实现)
- Mac OS X v10.5/ppc64 (method_exchangeImplementations+Ballard实现)
- Mac OS X v10.5/x86_64 (method_exchangeImplementations+Ballard实现)
- iOS 2.0+ (method_exchangeImplementations+Ballard实现)
- 健壮:所有参数都会进行检查,JRSwizzle返回一个具有高质量诊断的可选的
NSError
。
支持
请使用JRSwizzle的GitHub Issues标签 记录错误或功能请求。
要贡献,请Fork此项目,提交您的更改,然后发送给我一个拉取请求。
比较
至少有四种方法交换实现。以下是比较图表,帮助您了解它们之间的关系以及JRSwizzle为什么存在。
场景 | 交换技术 | 方法实现 | 正确行为 | 10.4 | 64位 |
---|---|---|---|---|---|
1 | 经典 | 直接 | YES | YES | NO |
2 | 经典 | 继承 | NO | YES | NO |
3 | Ballard | 直接 | YES | YES | NO |
4 | Ballard | 继承 | YES | YES | NO |
5 | Apple | 直接 | YES | NO | YES |
6 | Apple | 继承 | NO | NO | YES |
7 | JRSwizzle | 直接 | YES | YES | YES |
8 | JRSwizzle | 继承 | YES | YES | YES |
- 经典是CocoaDev的MethodSwizzling页面中描述的规范
MethodSwizzle()
实现。 - Ballard是Kevin Ballard的改进实现,它解决了继承方法的问题。
- Apple是10.5的新的
method_exchangeImplementations
API。 - JRSwizzle是这个包。
许可
源代码在MIT许可下分发。这是最简单、最宽松的许可。
版本历史
-
v1.0: 2012年3月2日
-
[新增] 支持 iOS。(Anton Serebryakov)
-
[新增] 类方法替换。(outis)
-
-
v1.0d1: 2009年5月31日
-
[修复] 通过将
hoisted_method_list->obsolete
清零来安抚 valgrind,它似乎会读取。(Daniel Jalkut) -
[修复] Xcode 3.2 现在明显需要对 10.3 目标显式设置
ARCHS
。(rentzsch)
-
-
v1.0d0: 2009年4月9日
- 迁移到 github。
-
v1.0d0: 2007年12月28日
- 开发中。