JRSwizzle
Description
JRSwizzle is source code package that offers a single, easy, correct+consistent interface for exchanging Objective-C method implementations ("method swizzling") across many versions of Mac OS X, iOS, Objective-C and runtime architectures.
More succinctly: JRSwizzle wants to be your one-stop-shop for all your method swizzling needs.
Download
$ 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.1.0
Swift Package Manager
The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift
compiler. It is in early development, but MRFilteredLocations does support its use on supported platforms.
Once you have your Swift package set up, adding MRFilteredLocations as a dependency is as easy as adding it to the dependencies
value of your Package.swift
.
dependencies: [
.package(url: "https://github.com/rentzsch/jrswizzle.git", from: "1.2.0")
]
Reasons for Existence
- Easy: Just do this:
[SomeClass jr_swizzle:@selector(foo) withMethod:@selector(my_foo) error:&error];
Voila. - Correct: There's a subtle interaction between method swizzling and method inheritance. Following in Kevin Ballard's footsteps, this package Does The Right Thing.
- Compatible: JRSwizzle should Just Work on any version of Mac OS X and iOS you care about. Here's the exhaustive compatibility list:
- Mac OS X v10.3/ppc (Ballard implementation)
- Mac OS X v10.4/ppc (Ballard implementation)
- Mac OS X v10.4/i386 (Ballard implementation)
- Mac OS X v10.5/ppc (method_exchangeImplementations+Ballard implementation)
- Mac OS X v10.5/i386 (method_exchangeImplementations+Ballard implementation)
- Mac OS X v10.5/ppc64 (method_exchangeImplementations+Ballard implementation)
- Mac OS X v10.5/x86_64 (method_exchangeImplementations+Ballard implementation)
- iOS 2.0+ (method_exchangeImplementations+Ballard implementation)
- Robust: All parameters are checked and JRSwizzle returns an optional
NSError
with high-quality diagnostics.
Support
Please use JRSwizzle's GitHub Issues tab to file bugs or feature requests.
To contribute, please fork this project, make+commit your changes and then send me a pull request.
Comparison
There's at least four swizzling implementations floating around. Here's a comparison chart to help you make sense of how they relate to each other and why JRSwizzle exists.
Scenario | Swizzle Technology | Method Implementation | Correct Behavior | 10.4 | 64-bit |
---|---|---|---|---|---|
1 | Classic | Direct | YES | YES | NO |
2 | Classic | Inherited | NO | YES | NO |
3 | Ballard | Direct | YES | YES | NO |
4 | Ballard | Inherited | YES | YES | NO |
5 | Apple | Direct | YES | NO | YES |
6 | Apple | Inherited | NO | NO | YES |
7 | JRSwizzle | Direct | YES | YES | YES |
8 | JRSwizzle | Inherited | YES | YES | YES |
- Classic is the canonical
MethodSwizzle()
implementation as described in CocoaDev's MethodSwizzling page. - Ballard is Kevin Ballard's improved implementation which solves the inherited method problem.
- Apple is 10.5's new
method_exchangeImplementations
API. - JRSwizzle is this package.
License
The source code is distributed under the nonviral MIT License. It's the simplest most permissive license available.
Version History
-
v1.2.0: Nov 28 2016
- [NEW] Added support for Swift Package Manager (m-ricca)
-
v1.1.0: Nov 28 2016
- [NEW] Block-based swizzle api. Note it uses
NSInvocation
which is known to be not the fastest of APIs. (dhcdht)
- [NEW] Block-based swizzle api. Note it uses
-
v1.0: Mar 2 2012
-
[NEW] iOS Support. (Anton Serebryakov)
-
[NEW] Class method swizzling. (outis)
-
-
v1.0d1: May 31 2009
-
[FIX] Soothe valgrind by nulling out
hoisted_method_list->obsolete
, which it apparently reads. (Daniel Jalkut) -
[FIX] Xcode 3.2 apparently now needs
ARCHS
set explicitly for 10.3 targets. (rentzsch)
-
-
v1.0d0: Apr 09 2009
- Moved to github.
-
v1.0d0: Dec 28 2007
- Under development.