ios - 如何在不遇到无限循环的情况下调整 NSError 初始化
问题描述
swizzling时如何调用原始的NSError
init方法?
我目前的实现
extension NSError {
@objc class func errorSwizzle() {
guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
method_exchangeImplementations(instance, swizzleInstance)
}
@objc class func errorUnSwizzle() {
guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
method_exchangeImplementations(swizzleInstance, instance)
}
@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
/// infinite loop as it calls the swizzled init again.
self.init(domain: swizzleDomain, code: code, userInfo: info)
/// Do something..
}
}
解决方案
您已经交换了实现,这意味着您必须调用:
@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
self.init(swizzleDomain: swizzleDomain, code: code, info: info)
}
因为self.init(swizzleDomain:...)
将包含原始初始化程序。
推荐阅读
- c++ - CUDA 数组如何存储在 GPU 内存中?它们在物理上是线性的吗?
- python - 没有使用python将行插入mysql
- java - Cucumber .feature 在 Intellij 中不起作用
- python - 我无法将 ML 模型加载到烧瓶中尝试使用 joblib 和 pickle
- c++ - Qt橡皮筋没有被绘制
- sql-server - SQL表值函数没有给出正确的值
- spring - 将一个 MockBean 注入另一个
- amazon-web-services - spring data flow : 使用 pod-annotations 将 IAM 角色分配给 pod
- powershell - 如何从 URL 下载所有文件?
- c++ - 如何将不可编译的配置文件添加到 QT 项目中?