9

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

问题是我的实现显然对这个私有类一无所知,而 self 指的是我要添加类别的类,无论可能是哪个类。所以我无法调用原始实现并且通常使用私有类。

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

4

1 回答 1

19

设法让它工作,实际上很简单。

所以我这样做的方式:

  • 做了一个 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);
    }
    
  • 要调用原始实现,我必须将 self 转换为 NSObject:

    id ret = [(NSObject *)self swizzled_somePrivateMethod:someParam];
    
  • 为了访问私有类的私有属性,我在 self 上使用了 valueForKey:

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

一切正常!

于 2014-03-17T16:54:36.270 回答