是否有任何面向方面的Objective-C库可以用于iPhone开发?
答案 0 :(得分:8)
有一个名为AspectCocoa的旧项目,这可能就是您要搜索的内容。
否则Í会建议你自己滚动。基于代理的AOP通过继承NSProxy
进行更改。或者你可以使用非常酷的Obj-C运行时函数method_exchangeImplementations()
来调整方法。
但除非你正在寻找一个有趣的练习,否则问问自己你想要达到什么目标,以及是否存在完全可行的Objective-C方法。
答案 1 :(得分:6)
查看我的文章,了解可能的解决方案: 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,所以消息转发步骤进一步,并将检查 methodSignatureForSelector:和forwardInvocation:方法on AOPAspect。
在methodSignatureForSelector中:我们给出了已经存储在方法包装器中的字典中的正确消息签名 对象
当它到达我们的forwardInvocation实现时:在AOPAspect中我们有一个完全配置的NSInvocation实例和 我们唯一要做的就是将选择器更改为扩展名 我们添加到AOPAspect类的版本。在这里我们可以运行块 在之前/之后注册给定方法,甚至代替 方法调用。当然,我们可以通过调用来运行原始方法 [anInvocation invoke]。
- 醇>
为简单起见,我们只是将NSInvocation对象传递给为该方法注册的块,以便它们可以访问所有参数和 通过getArgument返回值:atIndex:和 getReturnValue:methods。
就是这样。它适用于所有类型的返回类型,参数类型 以及论据的任何变化。
您可以在上面的链接中找到具体示例。请随意使用它。
答案 2 :(得分:4)
这个问题已经过时了,但我今天发现了这个项目,将来可能对某人有所帮助。
答案 3 :(得分:2)
另外,您可能需要查看https://github.com/moszi/AOP-in-Objective-C处的库,这是一个非常简单的NSProxy子类,允许您拦截方法调用的开始和结束。
有了这个,您甚至可以为对象创建一个代理类,以确保发送到您的对象的消息在一个线程上被序列化,而不管调用的线程如何。
答案 4 :(得分:1)
所有感兴趣的人都应该看看https://github.com/mgebele/MGAOP
这似乎是一个具有未来潜力的新项目。
答案 5 :(得分:1)
查看此https://github.com/pvantrepote/FlexOC 它是一个alpha版本,并使用(现在)Proxy实现。它也有依赖注射。
答案 6 :(得分:0)
我正在开发一个真实的(它不仅仅是方法调整)Objective-C的AOP-Framework。阿尔法将很快发布。您可以在Macoun'09会议上收听我的德语演讲: http://www.macoun.de/video2009ts6.php
如果您仍然对Objective-C的AOP感兴趣,可以发送邮件至negm-awad@cocoading.de或访问此网站: aspective-c.com/index.html 在几周之内。几个星期内,该网站和手册将有一个英文版(是的,不是由我翻译;-))。
答案 7 :(得分:0)
另一个是Aspect Objective-C:https://github.com/tomdalling/AspectObjectiveC
答案 8 :(得分:0)
使用Objective-C我会建议使用这里使用很多的Category-和Delegate-Pattern。这些比AOP更有用。 不要尝试使用您学习其他语言的解决方案解决问题。
答案 9 :(得分:0)
我在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
答案 10 :(得分:0)
https://github.com/eleme/Stinger
Stinger是一个高效库,具有很好的兼容性,可使用libffi在Objective-C中实现aop。