gpt4 book ai didi

ios - 如何调配私有(private)类的方法

转载 作者:技术小花猫 更新时间:2023-10-29 11:15:03 24 4
gpt4 key购买 nike

我有一个私有(private)类(都在 .m 中声明和定义)作为另一个类的实现的补充,它恰好在内部使用该私有(private)类。

我想调配那个私有(private)类的方法之一。

我定义了一个类别并做了通常的事情:

+(void)load 
{
Method original, swizzled;

original = class_getInstanceMethod(objc_getClass("SomePrivateClass"), @selector(somePrivateMethod:));
swizzled = class_getInstanceMethod(self, @selector(swizzled_somePrivateMethod:));
method_exchangeImplementations(original, swizzled);
}

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

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

最佳答案

设法让这个工作起来,其实很简单。

所以我是这样做的:

  • 制作了一个 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];
  • 为了访问私有(private)类的私有(private)属性,我在 self 上使用了 valueForKey:

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

一切正常!

关于ios - 如何调配私有(private)类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22361427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com