gpt4 book ai didi

swift method_exchangeImplementations 不起作用

转载 作者:搜寻专家 更新时间:2023-10-31 08:32:43 24 4
gpt4 key购买 nike

swift代码如下:

func swizzleMethod()
{
let method:Method = class_getInstanceMethod(object_getClass(self), Selector("function1"))

self.function1()
let swizzledMethod:Method = class_getInstanceMethod(object_getClass(self), Selector("function2"))

method_exchangeImplementations(method, swizzledMethod)

self.function1()


}

func function1()
{
print("function1 log")
}
func function2()
{
print("function2 log")

}

它记录:

function1 log

function1 log

/////我的环境是基于 swift 的项目,xcode7.2
这总是遇到 funtion1 方法体,所以我认为它交换失败,这两个方法在同一个类中,有人知道为什么吗?

最佳答案

我得到答案了,在方法名前面加上“dynamic”关键字!!!
像这样:

dynamic  func function1()
{
print("function1 log")
}
dynamic func function2()
{
print("function2 log")

}

原因:
Swift 优化代码以调用直接内存地址,而不是像在 Objective-C 中那样在运行时查找方法位置。所以我们需要告诉代码运行将其视为 Objective-C 代码。

答案详情:
方法调配是一种将一种方法实现替换为另一种方法的技术。如果您不熟悉 swizzling,请查看这篇博文。 Swift 优化代码以调用直接内存地址,而不是像在 Objective-C 中那样在运行时查找方法位置。所以默认情况下,调配在 Swift 类中不起作用,除非我们:
1. 使用 dynamic 关键字禁用此优化。这是首选,如果代码库完全在 Swift 中,也是最有意义的选择。
2.扩展NSObject。切勿仅为方法调配执行此操作(改为使用动态)。知道方法混合将在以 NSObject 作为基类的现有类中工作是很有用的,但我们最好有选择地选择具有动态的方法。
3. 在被调配的方法上使用@objc 注释。如果我们想要调配的方法也需要同时暴露给 Objective-C 代码,这是合适的。

感谢文章:15 Tips to Become a Better Swift Developer

关于swift method_exchangeImplementations 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34871893/

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