有一个名为AspectCocoa的旧项目,这可能就是你要搜索的内容.
否则Í会建议你自己滚动.基于代理的AOP通过子类化NSProxy进行更改.或者你可以使用非常酷的Obj-C运行时函数来调整方法method_exchangeImplementations().
但除非你正在寻找一个有趣的练习,否则问问自己你想要实现什么,以及是否有一个完美的Objective-C方法可以做到这一点.
查看我的文章,了解可能的解决方案:http: //codeshaker.blogspot.com/2012/01/aop-delivered.html
基本思想是在消息发送机制中建立一个钩子并强制它到消息转发路由:
所以简要说明它是如何工作的:
在注册特定类的方法调用时,它会创建一个方法包装器(AOPMethod)对象,并在其中存储有关该特定方法的每个信息以及将在拦截时使用的块.
使用method_setImplementation分别将方法的实现更改为_objc_msgForward或_objc_msgForward_stret.这是我们将消息发送路由到转发机制的点.下次在基类上调用消息时,它将返回_objc_msgForward实现,就好像它没有找到实现一样.因此,它开始通过消息转发步骤来解决它.尼斯.
我们使用class_addMethod将forwardingTargetForSelector:方法添加到基类,以指向我们在AOPAspect类中的实现.我们还将原始方法实现和选择器(具有扩展名称以防止类之间的冲突)添加到我们的AOPAspect实例.
在forwardingTargetForSelector:方法中,我们返回我们的AOPAspect实例.有了这个,我们将消息转发从基础对象路由到我们的AOPAspect对象.
这个forwardingTargetForSelector:方法将在AOPAspect上再次调用,因为我们没有实现该选择器.这种情况我们返回nil,因此进一步消息转发步骤,并将检查AOPAspect上的methodSignatureForSelector:和forwardInvocation:方法.
在methodSignatureForSelector中:我们给出了已经存储在方法包装器对象的字典中的正确消息签名.
当它到达我们的forwardInvocation实现时:在AOPAspect中我们有一个完全配置的NSInvocation实例,我们唯一要做的就是将选择器更改为我们添加到AOPAspect类的扩展版本.在这里,我们可以在方法调用之前/之后甚至代替方法调用运行为给定方法注册的块.当然,我们可以通过调用[anInvocation invoke]来运行原始方法.
为简单起见,我们只是将NSInvocation对象传递给为该方法注册的块,因此它们可以通过getArgument:atIndex:和getReturnValue:方法访问所有参数和返回值.
就是这样.它适用于所有类型的返回类型,参数类型和参数的任何变体.
您可以在上面的链接中找到具体示例.请随意使用它.
| 归档时间: |
|
| 查看次数: |
5331 次 |
| 最近记录: |