gpt4 book ai didi

ios - 是否可以使用 swift 来调配 deinit。如果是那么如何实现这一目标

转载 作者:搜寻专家 更新时间:2023-10-31 22:29:54 25 4
gpt4 key购买 nike

我想在项目中的 UIViewController 的每个子类中的 deinit 中记录一些语句。我不想在每个 View Controller 子类中复制/粘贴相同的行。

最佳答案

有一种方法可以实现这一目标。

您不能调配 deinit,但您可以调配另一种方法,如 viewDidLoad,以使用 associatedObject 毒化类。当 viewController 解除分配时,associatedObject 也会被解除分配。

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!)
}()
}

警告

当 viewController 被释放时,闭包将不会被准确地调用,因为 Deallocator 在 vi​​ewController 被完全释放后被释放。

关于ios - 是否可以使用 swift 来调配 deinit。如果是那么如何实现这一目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40647504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com