美文网首页
Method Swizzle

Method Swizzle

作者: ShawnDu | 来源:发表于2016-01-28 19:58 被阅读201次

在Swift中也可以用Objective-C运行时来进行Swizzle, 如果想在一个app中监听所有的点击事件,可以这样来做:

extension UIButton {
    class func SSSwizzleSendAction() {
        struct SSSwizzleToken {
            static var onceToken : dispatch_once_t = 0
        }
        dispatch_once(&SSSwizzleToken.onceToken) {
            let cls: AnyClass! = UIButton.self
            
            let originalSelector = Selector("sendAction:to:forEvent:")
            let swizzledSelector = Selector("SSSendAction:to:forEvent:")
            
            let originalMethod =
            class_getInstanceMethod(cls, originalSelector)
            let swizzledMethod =
            class_getInstanceMethod(cls, swizzledSelector)
            
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
    
    public func SSSendAction(action: Selector,
        to: AnyObject!,
        forEvent: UIEvent!)
    {
        struct SSButtonTapCounter {
            static var count: Int = 0
        }
        
        SSButtonTapCounter.count += 1
        print(SSButtonTapCounter.count)
        SSSendAction(action, to: to, forEvent: forEvent)
    }
}

sendAction:to:forEvent:为被替换的方法,SSSendAction:to:forEvent:为替换后的方法,在运行时,对这两个方法进行了交换,在SSSendAction:to:forEvent:中调用了自己,但是因为交换了两个方法的实现,在调用时就会调用原来的方法。

需要app启动时调用这个SSSendAction:to:forEvent:方法,可以写在UIButton初始化时调用:

extension UIButton {
    override public class func initialize() {
        if self != UIButton.self {
            return
        }
        UIButton.SSSwizzleSendAction()
    }
}

如果Swizzle的是Swift类型的方法,需要将原方法和替换方法加dynamic标记,指明需要动态派发机制。

相关文章

  • iOS Method Swizzle 源码分析

    iOS Method Swizzle 代码 平常我们用的方法都是method_exchangeImplementa...

  • Method Swizzle

    1、AOP编程思想 1.1、AOP是什么 AOP(Aspect Oriented Programming)直译为面...

  • Method Swizzle

    在Swift中也可以用Objective-C运行时来进行Swizzle, 如果想在一个app中监听所有的点击事件,...

  • method swizzle

  • Method Swizzle

    1.每个类里有一个dispatch table,将方法的名字(SEL)跟方法的实现(IMP:指向函数的指针)一...

  • iOS 黑魔法之Method-Swizzling

    Method-Swizzle Method Swizziling 是OC运行时给我们的用于交换Method的实现方...

  • 2018-01-08

    void Swizzle(Class c, SEL origSEL, SEL newSEL) { Method o...

  • iOS Swizzle Method

    1.实例方法交换 2.类方法交换 3.class一点总结 项目地址:https://github.com/hkkh...

  • iOS Swizzle method

    在理解这一套东西之前,我们先理清楚几个函数的意义 1.class_addMethod(aClass, origin...

  • iOS:load方法能不能被hook?

    今天我们讨论的hook方式仅仅是指Method Swizzle,fishhook、Cydia Substrate ...

网友评论

      本文标题:Method Swizzle

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