美文网首页
swift4.0 runtime 方法替换

swift4.0 runtime 方法替换

作者: sfaqasd | 来源:发表于2018-03-09 10:16 被阅读0次

    https://www.jianshu.com/p/a6b675f4d073

    +(void)load 方法已经失效
    swift3.0 中的 initialize 也失效

    网络收集来的代码,做记录

    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)  
    }

    相关文章

      网友评论

          本文标题:swift4.0 runtime 方法替换

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