参考文献: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释放了")
}
}
网友评论