首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导致递归的Swizzling

导致递归的Swizzling
EN

Stack Overflow用户
提问于 2019-01-13 10:52:40
回答 1查看 212关注 0票数 0

因此,当我尝试使用UIImageinit(named:)来设置可访问性标识符时,尽管我调用的是method_exchangeImplementation,但我的混合方法ftg_imageNamed(named name: String)init(named:)似乎都调用了我的混合方法:ftg_imageNamed(named name: String),创建了一个无限循环。这是为什么?

调用method_exchangeImplementation

代码语言:javascript
复制
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)
    }

}

以同样的方式失败的手动实现。

代码语言:javascript
复制
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)
    }

}
EN

回答 1

Stack Overflow用户

发布于 2019-01-13 12:33:10

self.UI(named: name)之前,你的声音似乎是"ok“。因此请检查该方法是否存在无限循环问题。

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

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

编辑

代码语言:javascript
复制
extension UIImage {
    static func initIncludingAccessibility(named: String) -> UIImage {
       let img = UIImage(named: named)
       img.setAccessibilityLabel(named)
       return img
    }
}

将其用作

代码语言:javascript
复制
let image = UIImage.initIncludingAccessibility(named: /* your_image_name*/)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54165727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档