很多时候嫌弃三方库或者系统框架的某个方法没有执行到自己想要的目的,进行如下代码修改。就可以达到追加代码的目的
//
// ViewController.swift
// PanaStackView
//
// Created by 曾祥林 on 2017/3/2.
// Copyright © 2017年 曾祥林. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
open override class func initialize() {
DispatchQueue.once(token: "haha") {
let originalSelector = #selector(ViewController.viewWillAppear(_:))
let swizzledSelector = #selector(ViewController.nsh_viewWillAppear(animated:))
let originalMethod = class_getInstanceMethod(self, originalSelector)
let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
if didAddMethod {
class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
}
// MARK: - Method Swizzling
func nsh_viewWillAppear(animated: Bool) {
self.viewWillAppear(animated)
NSLog("交叉出去了")
}
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.
}
override func viewWillAppear(_ animated: Bool) {
NSLog("没有交叉出去")
}
}