Swift3.0 - 黑魔法swizzle

作者: 酷走天涯 | 来源:发表于2016-10-08 15:42 被阅读1799次

Swift3.0 - 真的很简单
Swift3.0 - 数据类型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可选值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 对象和类
Swift3.0 - 属性
Swift3.0 - 函数和闭包
Swift3.0 - 初始化和释放
Swift3.0 - 协议protocol
Swift3.0 - 类和结构体的区别
Swift3.0 - 枚举
Swift3.0 - 扩展
Swift3.0 - 下标
Swift3.0 - 泛型
Swift3.0 - 异常错误
Swift3.0 - 断言
Swift3.0 - 自动引用计数(strong,weak,unowned)
Swift3.0 - 检测API
Swift3.0 - 对象的标识
Swift3.0 - 注释
Swift3.0 - 元类型
Swift3.0 - 空间命名
Swift3.0 - 对象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 类簇
Swift3.0 - 动态调用对象(实例)方法
Swift3.0 - 文本输出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 镜像
Swift3.0 - 遇到的坑

  • 举个例子理解一下

如果你想统计App中所有页面的点击事件,最简单快捷的方式是什么?

  extension UIButton{
   class func swip(){
    // 创建一个结构体,写个静态变量
    struct T{
        static let x:Bool = {
            let cls: AnyClass = UIButton.self
            // 创建消息对象
            let originalSelector = #selector(UIButton.sendAction(_:to:for:))
            let swizzleSelector = #selector(UIButton.swizzle_sendAction(action:to:forEvent:))
            // 创建方法
            let ori_method = class_getInstanceMethod(cls, originalSelector)
            let swi_method = class_getInstanceMethod(cls, swizzleSelector)
            
            print(ori_method)
            print(swi_method)
            // 交换两个方法的实现部分
            method_exchangeImplementations(ori_method,swi_method)
            print("执行了............")
            return false
        }()
    }
    // 这里必须执行一下,不然没法创建静态变量
    T.x
}

// 定义要交换的函数
public  func swizzle_sendAction(action: Selector,
                                to: AnyClass!,
                                forEvent: UIEvent!){
    // 定义一个累加器
    struct button_tap_count{
        static var count = 0
    }
    button_tap_count.count += 1
    print(button_tap_count.count)
    // 看似好像调用了自己构成死循环,但是 我们其实已经将两个方法名的实现进行了调换 所以 其实我们调用的是 方法sendAction:to:forEvent 的实现 这样就可以在不破环原先方法结构的基础上进行交换实现
    swizzle_sendAction(action: action, to: to, forEvent: forEvent)
}
}

使用

class ViewController: UIViewController {
     @IBOutlet weak var button: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
         // 执行一次交换方法
         UIButton.swip()
         button.addTarget(self, action: #selector(tap(button:)), for: .touchUpInside)
    }

    func tap(button:UIButton){
        print("你好")
    }
}

运行结果:

1
你好
2
你好
3
你好
4

相关文章

  • Swift3.0 - 黑魔法swizzle

    Swift3.0 - 真的很简单Swift3.0 - 数据类型Swift3.0 - ArraySwift3.0 -...

  • Swizzle黑魔法

    参考链接: 1、iOS黑魔法 Method Swizzling本质上就是对IMP和SEL进行交换。 那就回顾一下m...

  • Runtime第六篇-Method Swizzling

    Method Swizzling被称为runtime的黑魔法。swizzle在英文中的本意是“搅和”。 Metho...

  • Method Swizzle实际使用的坑

    method swizzle又被称为黑魔法,它是苹果公司给Objective-C赋予的神奇方法,同时也是R...

  • Swift的Swizzle黑魔法

    Objective-C Category 可以随意重写本类的方法, Swift的Extension虽然易用, 但仍...

  • iOS runtime swizzle 黑魔法

    NSMutableArray数组越界崩溃解决 对一个可变数组操作很频繁,并且在多个线程操作同一个可变数组时,发生数...

  • 2018国庆上海iOS面试题

    1.、请简单的介绍下APNS发送系统消息的机制 2、什么是 Method Swizzle(黑魔法),什么情况下会使...

  • iOS进阶补完计划--通读runtime

    说到runtime。所有iOS的开发者无不知晓。运行时、swizzle、黑魔法等等。不过用的时候是copy代码、还...

  • 创建一个私有库

    Swift3.0 如果想要对Swift的库进行修改, Swizzle运行时替换方法已经不好用了. 如果源码内的方法...

  • iOS Method Swizzle黑魔法小记

    本文主要内容为用runtime实现Swizzle,即调换两个方法的实现 一点iOS runtime的基本知识 Ob...

网友评论

本文标题:Swift3.0 - 黑魔法swizzle

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