【发布时间】:2019-06-07 12:13:36
【问题描述】:
因此,当我尝试调配UIImage 的init(named:) 以便可以使用图像名称设置可访问性标识符时,似乎即使我调用method_exchangeImplementation,我的调配方法ftg_imageNamed(named name: String)和init(named:) 调用我的混合方法:ftg_imageNamed(named name: String) 创建一个无限循环。这是为什么?
致电method_exchangeImplementation
extension UIImage {
static func swizzleInitImplementation() {
let originalSelector = #selector(UIImage.init(named:))
let swizzledSelector = #selector(UIImage.ftg_imageNamed(named:))
let imgSelf: AnyClass = self.classForCoder()
guard let originalMethod = class_getClassMethod(imgSelf, originalSelector),
let swizzledMethod = class_getClassMethod(imgSelf, swizzledSelector) else {
assertionFailure("The methodsw are not found")
return
}
method_exchangeImplementations(originalMethod, swizzledMethod)
}
@objc static func ftg_imageNamed(named name: String) {
setAccessibilityLabel(name)
self.ftg_imageNamed(named: name)
}
}
以同样方式失败的手动实现。
extension UIImage {
static func swizzleInitImplementation() {
let originalSelector = #selector(UIImage.init(named:))
let swizzledSelector = #selector(UIImage.ftg_imageNamed(named:))
let imgSelf: AnyClass = self.classForCoder()
guard let originalMethod = class_getClassMethod(imgSelf, originalSelector),
let swizzledMethod = class_getClassMethod(imgSelf, swizzledSelector) else {
assertionFailure("The methodsw are not found")
return
}
let imp1 = method_getImplementation(originalMethod)
let imp2 = method_getImplementation(swizzledMethod)
method_setImplementation(originalMethod, imp2)
method_setImplementation(swizzledMethod, imp1)
}
@objc static func ftg_imageNamed(named name: String) {
setAccessibilityLabel(name)
self.ftg_imageNamed(named: name)
}
}
【问题讨论】:
-
什么是
self.UI(named: name)? -
已修复。 @vikingosegundo,您是否因为错字而投了反对票?
-
您正在调用
ftg_imageNamed方法,同时进行调动。在那里,你递归的原因。 -
@x4h1d,据我了解,当您进行调配时,您是在告诉编译器在调用方法 1 时调用方法 2,在调用方法 2 时调用方法 1。@987654321 @。因此,不应发生递归。
-
我想强调的是,与 Objective-C 相比,
inits不是常规函数。他们没有输入func,也没有返回语句。我不知道这对调酒有什么后果,但我不希望他们表现得很好。