• 如何修改API中方法?


    问题场景:如何统一修改viewController中的viewDidLoad方法,添加一句打印操作?

    一、Method Swizzling解决

    1、在viewController的分类中新增viewDidLoaded方法,方法内部调用类的viewDidLoad方法,并增加NSLog方法。

    2、使用method_exchangeImplementation()交换viewDidLoaded和viewDidLoad方法。

    #import "UIViewController+Print.h"
    #import <objc/runtime.h> 
    
    @implementation UIViewController (Print)
    
    - (void)viewDidLoaded{
        [self viewDidLoaded];
        NSLog(@"Beche: %@ did load", self);
    }
    
    + (void)load{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            Method viewDidLoad = class_getInstanceMethod(self, @selector(viewDidLoad));
            Method viewDidLoaded = class_getInstanceMethod(self, @selector(viewDidLoaded));
            method_exchangeImplementations(viewDidLoad, viewDidLoaded);
        });
    }
    @end

    二、IMP解决

    1、新建viewController的分类。

    2、取得原始方法的IMP(implementation)指针。

    3、重新设置方法实现。

    typedef void (*_VIMP)(id,SEL,...); // 无返回值,有参数的IMP
    typedef id (*_IMP)(id,SEL,...); // 有返回值,有参数的IMP
    
    @implementation UIViewController (Print)
    
    + (void)load{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            // 获取原始方法
            Method viewDidLoad = class_getInstanceMethod(self, @selector(viewDidLoad));
            // 获取原始方法实现
            _VIMP viewDidLoad_IMP = (_VIMP)method_getImplementation(viewDidLoad);
            method_setImplementation(viewDidLoad, imp_implementationWithBlock(^(id target,SEL action){
                // 调用原始方法实现
                viewDidLoad_IMP(target,@selector(viewDidLoad));
                // 增加代码
                NSLog(@"Beche: %@ did load", target);
            }));
        });
    }
    @end
  • 相关阅读:
    LeetCode-079-单词搜索
    awk学习笔记
    Python实现排列组合算法
    python模拟登录人人
    Python的SQLite数据库使用方法
    C语言排序算法——插入排序算法
    C语言排序算法——简单选择排序算法
    C语言排序算法——冒泡排序算法
    Python学习——python的函数参数传递
    Python学习——实现secure copy功能
  • 原文地址:https://www.cnblogs.com/zhouyi-ios/p/5120947.html
Copyright © 2020-2023  润新知