Jas*_*ues 41
面向方面编程的基础是截距模式.我们从横切要求开始 - 需要在应用程序的许多部分中发生.然后使用切入点表达式,通过识别应该应用此要求的所有位置对其进行模块化.这是通过拦截方法调用和编织其他行为来完成的.因此,对于支持AOP的语言,它必须支持拦截模式.
现在,根据语言,可以在编译时,运行时或两者中应用方法拦截.Swift在这方面是一个有趣的案例,因为它支持以下几种方法调度:
如果您扩展NSObject或使用@objc装饰,则将使用消息传递.否则Swift将恢复为static/vtable方法调用.
摘要:
NB1:某些语言(如Java)使用静态/ vtable样式的方法调度,仍然支持运行时方法拦截.这是可能的,因为它们依赖于虚拟机,以及类加载器,另一个挂钩点.事实上,Java因此而被归类为"后期绑定"语言.
NB2:它在技术上可以支持提供编译到机器代码二进制文件的编译时编织,但有一些限制.首先是没有太多工具可以支持这一点,因为实施工作量很大,必须在每个平台上重复.第二是它限制了可用的AOP功能.
小智 6
不幸的是,Swift本身目前没有运行时支持.你必须依赖Objective-C桥接.
这是一个全新的iOS AOP库,用Objective-C编写,支持Swift.
https://github.com/MO-AI/MOAspects
只有"建议之前"和"建议后"可用,但在大多数情况下,它足以解决您的问题.请注意,当对纯Swift类/方法的拦截无法正常工作时,可能需要向函数添加"dynamic"关键字.
对于Objective-C,Aspects和BlockInjection,MOAspects优于两个最着名的AOP库.Aspects不支持类方法拦截和多个挂钩到类层次结构中的方法.BlockInjection有一个关键问题,不支持64位.
| 归档时间: |
|
| 查看次数: |
6163 次 |
| 最近记录: |