     /// 交换方法(Instance)
     /// - parameter originalSEL:  原始方法
     /// - parameter swizzlingSEL: 交换的方法
-    static func swizzling(originalSEL: Selector, swizzlingSEL: Selector) {
+    public static func swizzling(originalSEL: Selector, swizzlingSEL: Selector) {
         let cache = cacheYJSwizzling
         let key = "\(self)-\(originalSEL)-\(swizzlingSEL)" as NSString
         guard cache.object(forKey: key) == nil else {

/// KVO 回调
public typealias YJKVOBlock = (_ oldValue: Any?, _ newValue: Any?) -> Void

private class YJKeyValueObserver : NSObject  {
    
    weak var observer: AnyObject?
    var kvoBlock: YJKVOBlock!
    
    init(_ observer: AnyObject, kvoBlock: @escaping YJKVOBlock) {
        super.init()
        self.observer = observer
        self.kvoBlock = kvoBlock
    }
    
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if self.observer != nil {
            self.kvoBlock(change?[NSKeyValueChangeKey.oldKey], change?[NSKeyValueChangeKey.newKey])
        }
    }
    
}

    
    /// 添加 KVO 监听
    @objc
    func addObserver(_ observer: AnyObject, forKeyPath keyPath: String, using block: @escaping YJKVOBlock) {
        let kvoArray = self.kvoArray(keyPath: keyPath)
        for item in kvoArray {
            let kvoItem = item as! KeyValueObserver
            if observer.isEqual(kvoItem.observer) {
                kvoItem.block = block
                return
            }
        }
        let kvo = KeyValueObserver(self, observer: observer, keyPath: keyPath, block: block)
        kvoArray.add(kvo)
        self.addObserver(kvo, forKeyPath: keyPath, options: [.old, .new], context: nil)
    }
    
    /// 移除 KVO 监听
    @objc
    func removeObserverBlock(_ observer: NSObject, forKeyPath keyPath: String? = nil) {
        if keyPath == nil {
            for key in self.yj_kvoDictionary.allKeys {
                self.removeObserverBlock(observer, forKeyPath: key as? String)
            }
        } else {
            for item in self.kvoArray(keyPath: keyPath!) {
                let kvoItem = item as! KeyValueObserver
                if kvoItem.observer != nil, observer.isEqual(kvoItem.observer) {
                    self.removeObserver(kvoItem, forKeyPath: keyPath!)
                    kvoItem.observer = nil
