Skip to content
This repository has been archived by the owner on Feb 6, 2021. It is now read-only.

JonasGessner/JGMethodSwizzler

Repository files navigation

JGMethodSwizzler

© 2013-2014 Jonas Gessner


An easy to use Objective-C API for swizzling class and instance methods, as well as swizzling instance methods on specific instances only.

Setup

CocoaPods:
Add this to your Podfile:

pod 'JGMethodSwizzler', '2.0.1'

OR:

Add source Files:
1. Add the `JGMethodSwizzler` folder to your Xcode Project.
2. `#import "JGMethodSwizzler.h"`.

Documentation

#####For further examples see the JGMethodSwizzlerTests Xcode project.

JGMethodSwizzler can be used for three basic swizzling types: Swizzling a specific method for all instances of a class, swizzling class methods and swizzling instance methods of specific instances only.

JGMethodSwizzler is completely thread safe and can handle multiple swizzles. Instance-specific swizzling should however not be combined with global swizzling in the same method.

###Swizzling a class method: Swizzling the method +(int)[TestClass test:(int)]

[TestClass swizzleClassMethod:@selector(test:) withReplacement:JGMethodReplacementProviderBlock {
	//return a replacement block
	return JGMethodReplacement(int, const Class *, int arg) {
		//get the original value
		int orig = JGOriginalImplementation(int, arg);
		//return the modified value
		return orig+2;
	};
}];

After this code is run, calling the method will return the modified value until the method is deswizzled.

###Swizzling an instance method across all instances of a class: Swizzling the method -(int)[TestClass test:(int)]

[TestClass swizzleInstanceMethod:@selector(test:) withReplacement:JGMethodReplacementProviderBlock {
	//return a replacement block
	return JGMethodReplacement(int, TestClass *, int arg) {
		//get the original value
		int orig = JGOriginalImplementation(int, arg);
		//return the modified value
		return orig+2;
	};
}];

After this code is run, calling the method will return the modified value until the method is deswizzled.

###Swizzling an instance method for a specific instance: Swizzling the description method on a specific NSObjectinstance:

NSObject *object = [NSObject new];

[object swizzleMethod:@selector(description) withReplacement:JGMethodReplacementProviderBlock {
	return JGMethodReplacement(NSString *, NSObject *) {
		NSString *orig = JGOriginalImplementation(NSString *);
            
		return [orig stringByAppendingString:@" Swizzled!!"];
	};
}];

After this code is run, calling the method will return the modified value until the method is deswizzled.

###Deswizzling

All swizzles can be removed once they've been applied.

deswizzleAll() removes all swizzles.

####Deswizzling global class and instance swizzles

deswizzleGlobal() removes all swizzles that have been applied as global swizzles (not instance specific).

+deswizzleClassMethod:(SEL) deswizzles a specific class method.

+deswizzleInstanceMethod:(SEL) deswizzles a specific instance method.

+deswizzleAllClassMethods deswizzles all swizzled class methods of this class.

+deswizzleAllInstanceMethods deswizzles all swizzled instance methods of this class.

+deswizzleAllMethods deswizzles all swizzled methods of this class.

####Deswizzling Instance specific swizzles

deswizzleInstances() removes all swizzles that have been applied as instance specific swizzles.

-deswizzleMethod:(SEL) deswizzles a specific instance method of this instance.

-deswizzle deswizzles all swizzled instance methods of this instance.

Notes

JGMethodSwizzler works with both ARC and MRC/MRR.

Credits

Created by Jonas Gessner. ©2013-2014

Thanks to Andrew Richardson for his inspiration and contribution with InstanceHook.

License

Licensed under the MIT license.