JGMethodSwizzler 2.0.1

JGMethodSwizzler 2.0.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新发布2014年12月

Jonas Gessner 维护。



© 2013 Jonas Gessner


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。