有一种方法可以实现这一点。
你不能 swizzle deinit,但你可以 swizzle 另一个方法,比如viewDidLoad用associatedObject. 当 viewController 释放时,关联对象也会被释放。
final class Deallocator {
var closure: () -> Void
init(_ closure: @escaping () -> Void) {
self.closure = closure
}
deinit {
closure()
}
}
private var associatedObjectAddr = ""
extension UIViewController {
@objc fileprivate func swizzled_viewDidLoad() {
let deallocator = Deallocator { print("Deallocated") }
objc_setAssociatedObject(self, &associatedObjectAddr, deallocator, .OBJC_ASSOCIATION_RETAIN)
swizzled_viewDidLoad()
}
static let classInit: Void = {
let originalSelector = #selector(viewDidLoad)
let swizzledSelector = #selector(swizzled_viewDidLoad)
let forClass: AnyClass = UIViewController.self
let originalMethod = class_getInstanceMethod(forClass, originalSelector)
let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector)
method_exchangeImplementations(originalMethod!, swizzledMethod!)
}()
}
Run Code Online (Sandbox Code Playgroud)
警告
封闭不会得到所谓的确切时的viewController被释放,因为在Deallocator被释放后的viewController完全释放。
| 归档时间: |
|
| 查看次数: |
1003 次 |
| 最近记录: |