美文网首页
iOS Swift runtime实现方法交换

iOS Swift runtime实现方法交换

作者: 玉思盈蝶 | 来源:发表于2020-11-24 10:18 被阅读0次
    //
    //  ViewController.swift
    //  SwiftApp
    //
    //  Created by 彭思 on 2020/11/23.
    // Swift Runtime方法替换
    
    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
        }
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            print("这是一个方法:viewDidAppear")
        }
    }
    
    extension UIViewController {
        public class func initializeMethod(){
            let originalSelector = #selector(UIViewController.viewDidAppear(_:))
            let swizzledSelector = #selector(UIViewController.myMethod(animated:))
    
            let originalMethod = class_getInstanceMethod(self, originalSelector)
            let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
    
            //在进行 Swizzling 的时候,需要用 class_addMethod 先进行判断一下原有类中是否有要替换方法的实现
            let didAddMethod: Bool = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod!), method_getTypeEncoding(swizzledMethod!))
            //如果 class_addMethod 返回 yes,说明当前类中没有要替换方法的实现,所以需要在父类中查找,这时候就用到 method_getImplemetation 去获取 class_getInstanceMethod 里面的方法实现,然后再进行 class_replaceMethod 来实现 Swizzing
            if didAddMethod {
                class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod!), method_getTypeEncoding(originalMethod!))
            } else {
                method_exchangeImplementations(originalMethod!, swizzledMethod!)
            }
        }
    
        @objc func myMethod(animated: Bool) {
            self.myMethod(animated: animated)
            print("替换了")
            self.view.backgroundColor = UIColor.yellow
        }
    }
    
    

    调用:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        UIViewController.initializeMethod()
        return true
    }
    

    相关文章

      网友评论

          本文标题:iOS Swift runtime实现方法交换

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