面向方面的Objective-C库?

有没有可以用于iPhone开发的面向方面的Objective-C库?

有一个名为AspectCocoa的旧项目,这可能是你正在寻找的东西。

否则Í会build议你自己滚动。 基于代理的AOP通过NSProxy进行更改。 或者你可以用一些非常酷的Obj-C运行时函数method_exchangeImplementations()来做一些方法。

但是,除非你正在寻找一个有趣的练习,否则问问你自己想要达到什么目的,如果有一个完美的Objective-C方法来完成这个练习。

看看我的文章可能的解决scheme: http : //codeshaker.blogspot.com/2012/01/aop-delivered.html

其基本思路是钩住消息发送机制,强制消息转发路由:

所以简要说明它是如何工作的:

  1. 在注册特定类的方法调用时,它会创build一个方法包装器(AOPMethod)对象,并将关于该特定方法的每个信息与将在拦截时使用的块一起存储。

  2. 使用method_setImplementation分别将方法的实现更改为_objc_msgForward或_objc_msgForward_stret。 这是我们将消息发送路由到转发机制的地方。 下次在基类上调用消息时,它将返回_objc_msgForward实现,就好像它没有find实现。 所以它开始通过消息转发步骤解决它。 尼斯。

  3. 我们使用class_addMethod将forwardingTargetForSelector:方法添加到基类,以指向我们在AOPAspect类中的实现。 另外,我们将原始的方法实现和select器(带有扩展名称以防止类之间的冲突)添加到我们的AOPAspect实例中。

  4. 在forwardingTargetForSelector:方法中,我们返回AOPAspect实例。 有了这个,我们将消息从基础对象转发到我们的AOPAspect对象。

  5. 这个forwardingTargetForSelector:方法将在AOPAspect上被再次调用,因为我们没有实现这个select器。 这种情况下,我们返回零,所以消息转发的步骤进一步,将检查AOPAspect上的方法SignatureForSelector:和forwardInvocation:方法。

  6. 在methodSignatureForSelector中:我们给出了已经存储在方法包装器对象的字典中的正确的消息签名。

  7. 当它到达我们的forwardInvocation实现时:在AOPAspect中,我们有一个完全configuration的NSInvocation实例,我们唯一要做的就是将select器更改为我们添加到AOPAspect类的扩展版本。 在这里,我们可以运行在给定方法之前/之后注册的块,甚至可以代替方法调用。 当然,我们可以通过调用[anInvocation invoke]来运行原始的方法。

  8. 为了简单起见,我们只是将NSInvocation对象传递给为方法注册的块,所以它们可以通过getArgument:atIndex:和getReturnValue:方法访问所有参数和返回值。

就是这样。 它适用于所有types的返回types,参数types和参数的任何变体。

你可以在上面的链接find具体的例子。 请随意使用它。

这个问题很老,但我今天发现了这个项目,可能对未来的某个人有所帮助。

https://github.com/steipete/Aspects

你也可以在https://github.com/moszi/AOP-in-Objective-C查看这个库,这是一个非常简单的NSProxy子类,允许你拦截方法调用的开始和结束。

有了这个,你甚至可以为你的对象创build一个代理类,以确保发送到你的对象的消息被序列化在一个线程上,而不pipe调用线程。

所有仍然感兴趣的人应该看看https://github.com/mgebele/MGAOP

这似乎是一个具有未来潜力的新项目。

另一个是Aspect Objective-C: https : //github.com/tomdalling/AspectObjectiveC

与Objective-C我会build议去这里使用的类别和委托模式。 这些可能比AOP更有用。 不要试图用你学习的其他语言解决你的问题。

我在NSObject类中做了一些基本的aop前后处理函数

 @implementation NSObject (AOP) - (void)preprocess:(SEL)sel with:(void (^)(id obj, id param))implementingBlock{ Method m1 = class_getInstanceMethod(self.class, sel); IMP imp1 = method_getImplementation(m1); SEL replacement = sel_registerName( [[[NSString stringWithUTF8String:sel_getName(sel)] stringByAppendingString:@"pre"] cStringUsingEncoding:NSUTF8StringEncoding]); class_addMethod(self.class,replacement, imp1, nil); method_setImplementation(m1, imp_implementationWithBlock(^(id x, id param){ implementingBlock(x,param); [x performSelector:replacement withObject:param]; })); } - (void)postprocess:(SEL)sel with:(void (^)(id obj, id param))implementingBlock{ Method m1 = class_getInstanceMethod(self.class, sel); IMP imp1 = method_getImplementation(m1); SEL replacement = sel_registerName( [[[NSString stringWithUTF8String:sel_getName(sel)] stringByAppendingString:@"post"] cStringUsingEncoding:NSUTF8StringEncoding]); class_addMethod(self.class,replacement, imp1, nil); method_setImplementation(m1, imp_implementationWithBlock(^(id x, id param){ [x performSelector:replacement withObject:param]; implementingBlock(x,param); })); } @end 

我正在为Objective-C开发一个真正的(不仅仅是方法debugging)的AOP框架。 阿尔法即将发布。 你可以在这里听听我在德国Macoun'09会议上的演讲: http : //www.macoun.de/video2009ts6.php

如果您仍然对Objective-C的AOP感兴趣,您可以发邮件给negm-awad@cocoading.de或者在几周内访问这个站点: aspective-c.com/index.html 。 将有一个英文版本(是的,不是由我翻译;-))的网站和手册在几个星期。

Interesting Posts