如何调配私人课程的方法

我有一个私有类(在.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"]; 

一切正常!

Interesting Posts