Swift 3.x Method Swizzling

在Swift3.x版本当你调用initialize()会出现下图警告:

屏幕快照 2017-08-25 下午12.12.02.png

大致的意思是initialize()该方法将会被删除.

参考国外的大牛方法的实现方式:

解决思路: initialize()是提供一个runtime代码的插入位置, 且这个方法只能执行一次, 我们在程序刚执行的时候调用runtime获取所有的class, 然后遍历它们, 如果class实现了protocol的代理就立即执行代理的方法.

  • 第一步
protocol SelfAware: class {
    static func awake()
}

class NothingToSeeHere {
    static func harmlessFunction() {
        /*
         *  public func objc_getClassList(_ buffer: AutoreleasingUnsafeMutablePointer<Swift.AnyClass?>!, _ bufferCount: Int32) -> Int32
         *  该函数是获取已注册的类, 传入两个参数
         *  第一个参数buffer: 已分配好空间的数组
         *  第二个参数bufferCount: 数组中存放元素的个数
         *  返回值是注册的类的总数
         *  当参数bufferCount的值小于注册类的总数, 获取到的注册类的集合的任意子集
         *  第一个参数为nil时将会获取到当前注册的所有的类, 此时可存放元素的个数为0, 返回自为当前所有类的总数
         */
        let typeCount = Int(objc_getClassList(nil, 0))
        //存放class的已分配好的空间的数组指针
        let types = UnsafeMutablePointer<AnyClass?>.allocate(capacity: typeCount)
        //存放class的已分配好的空间的可选数组指针
        let autoreleasingTypes = AutoreleasingUnsafeMutablePointer<AnyClass?>(types)
        //获取已注册的类存放到types里
        objc_getClassList(autoreleasingTypes, Int32(typeCount))
        for index in 0..<typeCount {
            //实现SelfAware协议, 会执行方法
            (types[index] as? SelfAware.Type)?.awake()
        }
        types.deallocate(capacity: typeCount)
    }
}
  • 第二部
extension UIApplication {
    private static let runOnce: Void = {
        NothingToSeeHere.harmlessFunction()
    }()
    
    open override var next: UIResponder? {
        UIApplication.runOnce
        return super.next
    }
    
}
  • 第三部
class ViewController: UIViewController, SelfAware {

    static func awake() {
        print("1111111111")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,857评论 0 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,269评论 19 139
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,696评论 33 466
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,872评论 18 399
  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 4,601评论 0 12