JGMethodSwizzler 提供了一个易于使用的 Objective-C 级别的 API,用于替换类和实例方法,以及仅对特定实例替换实例方法。
JGMethodSwizzlerTests
Xcode 项目的示例。JGMethodSwizzler 可用于三种基本替换类型:替换类的所有实例的特定方法,替换类方法和仅对特定实例替换实例方法。
JGMethodSwizzler 完全线程安全,可以处理多个替换。但是,实例特定的替换不应与同一方法中的全局替换结合使用。
替换方法 +(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;
};
}];
运行此代码后,调用该方法将返回修改后的值,直到该方法被取消替换。
替换方法 -(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;
};
}];
运行此代码后,调用该方法将返回修改后的值,直到该方法被取消替换。
替换特定 NSObject
实例上的 description
方法
NSObject *object = [NSObject new];
[object swizzleMethod:@selector(description) withReplacement:JGMethodReplacementProviderBlock {
return JGMethodReplacement(NSString *, NSObject *) {
NSString *orig = JGOriginalImplementation(NSString *);
return [orig stringByAppendingString:@" Swizzled!!"];
};
}];
运行此代码后,调用该方法将返回修改后的值,直到该方法被取消替换。
一旦应用了所有替换,都可以将它们移除。
deswizzleAll()
移除所有替换。
deswizzleGlobal()
移除所有作为全局替换应用(非实例特定)的替换。
+deswizzleClassMethod:(SEL)
取消特定类方法的替换。
+deswizzleInstanceMethod:(SEL)
取消特定实例方法的替换。
+deswizzleAllClassMethods
取消此类所有替换的类方法。
+deswizzleAllInstanceMethods
取消此类所有替换的实例方法。
+deswizzleAllMethods
取消此类所有替换的方法。
deswizzleInstances()
删除所有已应用于实例特定混洗的操作。
-deswizzleMethod:(SEL)
取消此实例特定实例方法的混洗。
-deswizzle
取消此实例所有混洗实例方法的混洗。
JGMethodSwizzler
使用ARC和MRC/MRR。
由Johas Gessner创建。
感谢Andrew Richardson提供灵感及其对InstanceHook
的贡献。
许可协议为MIT。