如何调配私人课程的方法
我有一个私有类(在.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); }
问题是,我的实现显然不知道这个私人类什么,自我指的是我将类添加到类,无论哪个类可能是。 所以我没有办法调用原来的实现,并且一般和私有类一起工作。
什么是正确的方法来解决这个问题?
pipe理得到这个工作,其实很简单。
所以我这样做的方式:
- 做了一个NSObject类别:
@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); }
-
要调用原始实现,我不得不把自己投给NSObject:
id ret = [(NSObject *)self swizzled_somePrivateMethod:someParam];
-
要访问私有类的私有属性,我使用了valueForKey on self:
id privateProperty = [self valueForKey:@"__privateProperty"];
一切正常!