美文网首页
iOS-方法交换

iOS-方法交换

作者: CocoaJason | 来源:发表于2022-03-07 16:59 被阅读0次
    
    @interface Person : NSObject
    
    @end
    
    @implementation Person
    
    @end
    
    @interface Person (swizzleExample)
    
    @end
    
    @implementation Person (swizzleExample)
    
    - (void)swizzleExample {
        Class class = [self class];
        SEL originalSelector = @selector(originalMethod);
        SEL replacedSelector = @selector(replacedMethod);
        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method replacedMethod = class_getInstanceMethod(class, replacedSelector);
        BOOL success = class_addMethod(class,
                                       originalSelector,
                                       method_getImplementation(replacedMethod),
                                       method_getTypeEncoding(replacedMethod));
        if (success) {
            class_replaceMethod(class,
                                replacedSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, replacedMethod);
        }
    }
    
    - (void)originalMethod {
        NSLog(@"方法名为 originalMethod,其 _cmd 的值为:%@",[NSString stringWithFormat:@"*** -%@", NSStringFromSelector(_cmd)]);
    }
    
    
    - (void)replacedMethod {
        NSLog(@"方法名为 replacedMethod,其 _cmd 的值为:%@",[NSString stringWithFormat:@"*** -%@", NSStringFromSelector(_cmd)]);
    }
    
    @end
    
    
    Person *personModel = [[Person alloc] init];
      
        NSLog(@"## swizzle 之前,调用 originalMethod 的打印信息:");
        [personModel originalMethod];
        [personModel replacedMethod];
        
        [personModel swizzleExample];
        NSLog(@"## swizzle 之后,调用 originalMethod 的打印信息:");
        [personModel originalMethod];
        [personModel replacedMethod];
    
    2022-03-03 10:34:36.975410+0800 dsadasdasdsa[14591:17348825] ## swizzle 之前,调用 originalMethod 的打印信息:
    2022-03-03 10:34:36.975549+0800 dsadasdasdsa[14591:17348825] 方法名为 originalMethod,其 _cmd 的值为:*** -originalMethod
    2022-03-03 10:34:36.975633+0800 dsadasdasdsa[14591:17348825] 方法名为 replacedMethod,其 _cmd 的值为:*** -replacedMethod
    2022-03-03 10:34:36.975883+0800 dsadasdasdsa[14591:17348825] ## swizzle 之后,调用 originalMethod 的打印信息:
    2022-03-03 10:34:36.975991+0800 dsadasdasdsa[14591:17348825] 方法名为 replacedMethod,其 _cmd 的值为:*** -originalMethod
    2022-03-03 10:34:36.976091+0800 dsadasdasdsa[14591:17348825] 方法名为 originalMethod,其 _cmd 的值为:*** -replacedMethod
    

    相关文章

      网友评论

          本文标题:iOS-方法交换

          本文链接:https://www.haomeiwen.com/subject/dyvyrrtx.html