Jac*_*b K 9 runtime swizzling ios
我有一个私有类(在.m中声明和定义)作为对不同类的实现的补充,恰好在内部使用该私有类.
我想调整那个私人班级的方法之一.
我定义了一个类别,并按照惯例做了:
+(void)load
{
Method original, swizzled;
original = class_getInstanceMethod(objc_getClass("SomePrivateClass"), @selector(somePrivateMethod:));
swizzled = class_getInstanceMethod(self, @selector(swizzled_somePrivateMethod:));
method_exchangeImplementations(original, swizzled);
}
Run Code Online (Sandbox Code Playgroud)
问题是我的实现显然对这个私有类一无所知,而self指的是我要添加类别的类,无论哪个类都可能.因此,我无法调用原始实现,并且通常使用私有类.
解决这个问题的正确方法是什么?
Jac*_*b K 17
为实现这一目标而进行管理,实际上非常简单.
所以我这样做的方式:
@interface NSObject(PrivateSwizzleCategory)搅和:
+(void)load
{
Method original, swizzled;
original = class_getInstanceMethod(objc_getClass("SomePrivateClass"), @selector(somePrivateMethod:));
swizzled = class_getInstanceMethod(self, @selector(swizzled_somePrivateMethod:));
method_exchangeImplementations(original, swizzled);
}
Run Code Online (Sandbox Code Playgroud)要调用原始实现,我必须将self转换为NSObject:
id ret = [(NSObject *)self swizzled_somePrivateMethod:someParam];
Run Code Online (Sandbox Code Playgroud)要访问私有类的私有属性,我在self上使用了valueForKey:
id privateProperty = [self valueForKey:@"__privateProperty"];
Run Code Online (Sandbox Code Playgroud)一切正常!
| 归档时间: |
|
| 查看次数: |
3159 次 |
| 最近记录: |