gpt4 book ai didi

swift - Swizzling导致递归

转载 作者:行者123 更新时间:2023-11-28 11:39:18 26 4
gpt4 key购买 nike

因此,当我尝试调整 UIImageinit(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) 之前,您的调配看起来“ok”。因此,请检查该方法是否存在无限循环问题。

现在,这是一个糟糕的 swizzling 实现。 UIImage.init(named:) 返回 UIImage 的实例,其中 swizzled 方法 UIImage.ftg_imageNamed(named:) 返回 Void。原始方法和 swizzled 方法都应具有相同的参数和返回类型,实现可能会有所不同。

你应该考虑一个简单的扩展方法来实现你想要的而不是混合。

编辑

extension UIImage {
static func initIncludingAccessibility(named: String) -> UIImage {
let img = UIImage(named: named)
img.setAccessibilityLabel(named)
return img
}
}

用作

let image = UIImage.initIncludingAccessibility(named: /* your_image_name*/)

关于swift - Swizzling导致递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54165727/

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