我有方法setDelegate: CLLocationManagersetDelegate: 我在封闭框架中也有继承类。 我想交换实现setDelegate: for this class和all inheritance。

NSArray *sfl_classGetSubclasses(Class parentClass) {
    int numClasses = objc_getClassList(NULL, 0);
    Class *classes = NULL;

    classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);
    numClasses = objc_getClassList(classes, numClasses);

    NSMutableArray *result = [NSMutableArray array];
    for (NSInteger i = 0; i < numClasses; i++) {
        Class superClass = classes[i];
        do {
            superClass = class_getSuperclass(superClass);
        } while(superClass && superClass != parentClass);

        if (superClass == nil) {
            continue;
        }

        [result addObject:classes[i]];
    }
    free(classes);
    return result;
}

@implementation CLLocationManager (SimulateFakeLocations)

+ (void)initialize {
    [self swizzleSelector:@selector(setDelegate:) class1:self withSelector:@selector(sfl_setDelegate:) class2:self];
    NSArray *subclasses = sfl_classGetSubclasses(self); // I get empty array
    for (Class cl in subclasses) {
        [self swizzleSelector:@selector(setDelegate:) class1:cl withSelector:@selector(sfl_setDelegate:) class2:self];
    }
}

+ (void)swizzleSelector:(SEL)sel1 class1:(Class)class1 withSelector:(SEL)sel2 class2:(Class)class2
{
    Method originalMethod = class_getInstanceMethod(class1, sel1);
    Method swizzledMethod = class_getInstanceMethod(class2, sel2);

    BOOL didAddMethod = class_addMethod(class1,
                                        sel1,
                                        method_getImplementation(swizzledMethod),
                                        method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(class2,
                            sel2,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
// ...
@end

但我没有得到任何子类sfl_classGetSubclasses 这是第一个问题。 第二:我知道子类的名称,我尝试在inhered类中交换方法。

Class cl = NSClassFromString(@"YMKLocationManager");
[self swizzleSelector:@selector(setDelegate:) class1:cl withSelector:@selector(sfl_setDelegate:) class2:self];

但应用程序在运行时会下降。 直到我使用封闭框架,交换方法才能完美运行。

  ask by Gralex translate from so

本文未有回复,本站智能推荐:

1回复

UIResponder的繁琐复制方法

我烦恼UIResponder的Copy:和Paste:方法。 我必须将复制的内容写入专用粘贴板。 如何将复制的字符串写到粘贴板。 我得到的参数是id类型。 如果我将其转换为NSString,那将是不合适的,因为调用此方法的是发送方(UIMenuController)。
1回复

方法混乱的实现没有发生

我正在尝试学习下垂的概念。 即使我添加了method_exchangeImplementations ,这些方法仍然没有被淘汰。 对我要去哪里错有任何想法吗?
1回复

如何通过扩展使用一些自定义方法来混合类的方法

我在玩 swizzling。 我编写了这段代码来交换具有扩展名的类的方法的实现。 @objc class A: NSObject { @objc func name() { print("this is class A") } } extension A {
8回复

Objective-C中方法调配的危险是什么?

我听到有人说方法调整是一种危险的做法。 即使名称调整也表明它有点作弊。 方法Swizzling正在修改映射,以便调用选择器A实际上将调用实现B.这样做的一个用途是扩展封闭源类的行为。 我们能否将风险正式化,以便任何决定是否使用调酒的人都可以做出明智的决定是否值得他们尝试做什么。
1回复

为UIView调整方法

我正在关注“ 这个 ”指南。 捕获UIView touchesBegan,但是当我在UIViewController中使用NSLog() touchesBegan时,它不会触发,但会在swizzled方法中触发。 有没有办法可以在两者中解雇它?
1回复

方法涡流无法正确点火?

我正在关注本文,以更好地了解方法混乱的工作方式。 我有这样的主视图控制器(这是一个新项目): 如果运行此命令,则将打印glviewappear,如果删除 然后它会打印viewWillAppear: <GLViewController: 0x9d11a90> 。 我
1回复

CategoryA应该如何覆盖categoryB方法

在AFNetworking 2.0中,在UIImageView+AFNetworking有一种方法: 我想覆盖它并在这里返回我的自定义对象。 我也想重写AFImageCache所有方法,因此基本上我会在这里建立一个新协议。 我曾经考虑过方法混乱,但是由于缺乏经验,我不确定这是否适用于
2回复

复制多个方法swizzles的方法IMP

我有一个类设置,理想情况下将读取传入的任何类的方法,然后在运行时将它们全部映射到单个选择器上,然后将它们转发到它们的原始选择器。 这确实可行,但我一次只能使用一种方法。 问题似乎是,一旦我调整第一个方法,我的IMP捕获和转发方法现在已经与其他方法IMP交换。 由于他们使用新交换的IMP