Swift中安全的Objective-C Runtime方法调配与Hook
在Swift环境下调用objc_msgSend、method_exchangeImplementations,处理Swift类与OC类的混编场景,防止死锁与类型擦除。 · 难度:入门 · +10XP
Swift中安全的Objective-C Runtime方法调配与Hook
尽管Swift推荐纯Swift实现,但在需要注入系统行为(如URLSession拦截)时仍可使用OC Runtime。本教程展示如何为Swift中的@objc dynamic方法安全地执行Method Swizzling,使用dispatch_once隔离、method_getImplementation类型安全包装,以及避免Aspect库导致的循环调用。同时还涵盖Swift extension中@_dynamicReplacement关键字的风险对比。
extension UIViewController {
@objc dynamic func swizzled_viewDidAppear(_ animated: Bool) {
swizzled_viewDidAppear(animated) // 交换后的原始调用
print("View did appear: \(self)")
}
static func swizzle() {
let original = #selector(viewDidAppear(_:))
let swizzled = #selector(swizzled_viewDidAppear(_:))
// 安全交换
}
}