首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift函数swizzling /运行时

Swift函数swizzling /运行时
EN

Stack Overflow用户
提问于 2014-06-03 15:57:56
回答 8查看 18.6K关注 0票数 20

在Swift之前,在Objective中,我会使用<objc/runtime.h>在类中使用swizzle或钩子方法。

如果有人有任何关于修改Swift的运行时和挂钩功能的信息,比如CydiaSubstrate和其他在这方面有帮助的库,请告诉我。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2014-06-04 22:31:50

我用斯威夫特的方法成功了。此示例演示如何在NSDictionary上挂钩描述方法。

我的实施:

代码语言:javascript
复制
extension NSDictionary {
     func myDescription() -> String!{
        println("Description hooked")
        return "Hooooked " + myDescription();
    }
}

Swizzling代码:

代码语言:javascript
复制
func swizzleEmAll() {
        var dict:NSDictionary = ["SuperSecret": kSecValueRef]
        var method: Method = class_getInstanceMethod(object_getClass(dict), Selector.convertFromStringLiteral("description"))

        println(dict.description) // Check original description

        var swizzledMethod: Method = class_getInstanceMethod(object_getClass(dict), Selector.convertFromStringLiteral("myDescription"))
        method_exchangeImplementations(method, swizzledMethod)

        println(dict.description) //Check that swizzling works
    }

编辑:此代码将适用于从NSObject继承的任何自定义Swift类(但不适用于不适用的类)。更多示例- https://github.com/mbazaliy/MBSwizzler

票数 40
EN

Stack Overflow用户

发布于 2014-06-03 17:04:02

您很可能能够对继承自Objective类的快速生成的类进行分步操作,没有问题,因为它们似乎一直使用动态方法分派。您可能可以通过跨桥传递在目标-C运行时中存在的快速定义类的方法,但目标-C侧方法很可能只是跨桥到快速运行时的代理,因此不清楚是否特别有用。

“纯”快速方法调用似乎不会通过类似于objc_msgSend的任何东西动态地发送,而且(从简短的实验中)看来,swift的类型安全性是在编译时实现的,并且对于非类类型,在运行时缺少许多实际的类型信息(即已消失)(这两种信息都可能有助于swift的所谓速度优势)。

由于这些原因,我预计有意义的快速方法比目标C方法要困难得多,而且可能看起来更像mach_override而不是目标C方法。

票数 21
EN

Stack Overflow用户

发布于 2015-10-13 09:06:40

我在一年多后才回答这个问题,因为其他的答案都没有为每一种类的方法摆动提供明确的要求。

其他人所描述的,虽然它对基金会/uikit类的扩展(比如NSDictionary)是完美无缺的,但是永远不会为您自己的Swift类工作。

正如所描述的这里,除了在您的自定义类中扩展NSObject之外,还有一个额外的方法swizzling要求。

您想要对进行快速处理的方法必须标记为 dynamic

如果您不标记它,运行时将继续调用原始方法,而不是swizzled方法,即使方法指针似乎被正确地交换了。

更新:

我扩展了这个答案,在博客上发表

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24019683

复制
相关文章

相似问题

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