美文网首页
2019-08-22 swift 实现YYWeakProxy

2019-08-22 swift 实现YYWeakProxy

作者: 幸福晓杰2016 | 来源:发表于2019-08-22 18:53 被阅读0次

参考文献:NSProxy 一些 使用
关于NSProxy的理解
Swift中Timer的循环引用解决方案(类似NSProxy

1.YYWeakProxy继承NSProxy 和 NSObject 的比较

使用 NSProxy 做消息转发 比 使用 NSObject 效率高。
当这两个类都没有执行消息转发时,会报什么样的错误?

NSProxy 会直接报 methodSignatureForSelector 方法错误
NSObject 会报 [NSObject timerTest] 没有找到 错误
他们两个的执行流程:

继承至 NSObject 的类:
先去类对象里面找 -> 父类的类对象找 -> 缓存中 -> 搜索
继承至 NSProxy 的类:
先会在本类中找,如果没有直接消息转发。不会去 类对象找,父类的类对象中找。

2. 关于NSProxy的理解

NSProxy是一个为对象定义接口的抽象父类,并且为其它对象或者一些不存在的对象扮演了

替身角色

NSProxy 是跟 NSObject 一样的基类,都遵守<NSObject>协议
NSProxy是一个抽象类,必须继承实例化其子类才能使用。
NSProxy从类名来看是代理类专门负责代理对象转发消息的。相比NSObject类来说NSProxy更轻量级,通过NSProxy可以帮助Objective-C间接的实现多重继承的功能。

好处:1.可以解除循环引用,同时完成消息转发
2.实现多重继承
3.实现偷天换日的实现: target与selector都被替换了。

3.困难一:虽然说继承自NSProxy更好,但是init方法把我难住了,我该怎么写初始化方法呢?

我只能参考第三篇文章的写法,放弃继承NSProxy,改为继承NSObject

import UIKit

class YYWeakProxySwift: NSObject /* & NSProxy */ {

    // 只有继承NSObject类的子类才有消息转发机制,swift基类如果不继承基类,将是静态类,不存在消息动态转发
    weak var target:NSObject?
    
    static func  proxyWithTarget(target:NSObject) -> YYWeakProxySwift{
        return YYWeakProxySwift.init(target: target)
    }

    convenience init(target:NSObject){
        self.init()
        self.target = target
    }
//  核心代码
    override func forwardingTarget(for aSelector: Selector!) -> Any? {
        return target
    }
    
    
// NSObject 一些方法复写
    
    override func isEqual(_ object: Any?) -> Bool {
        return target?.isEqual(object) ?? false
    }
    
    override var hash: Int{
        return target?.hash ?? -1
    }
    
    override var superclass: AnyClass?{
        return target?.superclass ?? nil
    }

//    override func `self`() -> Self{
//        return target?.self()
//    }
    
    
    override func isProxy() -> Bool {
        return true
    }

    override func isKind(of aClass: AnyClass) -> Bool {
        return target?.isKind(of: aClass) ?? false
    }
    
    override func isMember(of aClass: AnyClass) -> Bool {
        return target?.isMember(of: aClass) ?? false
    }
    
    override func conforms(to aProtocol: Protocol) -> Bool {
        return  target?.conforms(to: aProtocol) ?? false
    }
    
    override func responds(to aSelector: Selector!) -> Bool {
        return target?.responds(to: aSelector) ?? false
    }
    
    override var description: String{
        return target?.description ?? "nil"
    }
    
    override var debugDescription: String{
        return target?.debugDescription ?? "nil"
    }
    
    deinit {
        print("Proxy释放了")
    }

}

相关文章

网友评论

      本文标题:2019-08-22 swift 实现YYWeakProxy

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