2014-03-12 61 views
7

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

的问题是,我的实现显然不知道这个私有类东西和自我指类我添加的类别,取其可能是类。所以我无法调用原始实现,并且一般与私有类一起工作。

解决这个问题的正确方法是什么?

回答

12

管理得到这个工作,其实很简单。

所以我的方式做到了:

  • 做出了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自:

    id privateProperty = [self valueForKey:@"__privateProperty"]; 
    

一切正常!

+0

你可以用这样的混合私有方法将应用程序发送到AppStore吗? – nyteshade

+0

在我的情况下,这是一个第三方库的私人方法,所以它不是一个问题,应用程序通过审查过程没有任何问题。 –