Iphone 面向方面的Objective-C库?

Iphone 面向方面的Objective-C库?,iphone,objective-c,ios,aop,Iphone,Objective C,Ios,Aop,是否有任何面向方面的Objective-C库可以用于iPhone开发?有一个老项目,名为,这可能就是您正在搜索的内容 否则,我建议你自己滚。通过子类化NSProxy更改基于代理的AOP。或者您可以使用非常酷的Obj-C运行时函数进行一些方法swizzling 但是,除非您正在寻找一个有趣的练习,否则请自问您想要实现什么,以及是否有一种现有的完美工作的Objective-C方法来实现它。此外,您可能还想查看库,其中有一个非常简单的Nproxy子类,允许您截取方法调用的开始和结束 有了它,您甚至可以

是否有任何面向方面的Objective-C库可以用于iPhone开发?

有一个老项目,名为,这可能就是您正在搜索的内容

否则,我建议你自己滚。通过子类化
NSProxy
更改基于代理的AOP。或者您可以使用非常酷的Obj-C运行时函数进行一些方法swizzling


但是,除非您正在寻找一个有趣的练习,否则请自问您想要实现什么,以及是否有一种现有的完美工作的Objective-C方法来实现它。

此外,您可能还想查看库,其中有一个非常简单的Nproxy子类,允许您截取方法调用的开始和结束

有了它,您甚至可以为对象创建一个代理类,以确保发送到对象的消息在单个线程上序列化,而不管调用线程是什么

我正在为Objective-C开发一个真正的AOP框架(不仅仅是方法转换)。alpha很快就会发布。您可以在这里收听我在马昆09年会议上的德语演讲:

如果您仍然对Objective-C的AOP感兴趣,您可以向我发送邮件或访问此网站:
几周后。几周后,网站和手册将有一个英文版(是的,不是我翻译的;-)。

所有仍然感兴趣的人都应该看看


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

另一个是Aspect Objective-C:

查看我的文章,了解可能的解决方案:

基本思想是在消息发送机制中创建一个钩子,并将其强制到消息转发路由:

下面简单介绍一下它的工作原理:

  • 在注册特定类的方法调用时,它创建一个方法包装器(AOPMethod)对象并存储其中的所有信息 关于该特定方法以及将在 拦截

  • 使用方法setImplementation将方法的实现分别更改为_objc_msgForward或_objc_msgForward_stret。这是我们将消息发送路由到转发服务器的点 机制。下次在基类上调用消息时,它 将返回_objc_msgForward实现,就好像它没有找到 实施因此,它开始通过检查 消息转发步骤。很好

  • 我们使用class_addMethod将forwardingTargetForSelector:方法添加到基类中,以指向AOPAspect中的实现 班级。此外,我们还添加了原始方法实现和选择器 (使用扩展名以防止类之间的冲突)到 AOPAspect实例

  • 在forwardingTargetForSelector:方法中,我们返回AOPAspect实例。这样,我们就可以从 基本对象到我们的AOPAspect对象

  • 此forwardingTargetForSelector:方法将在AOPAspect上再次调用,因为我们没有实现该选择器。这个案子我们 返回nil,因此消息转发将进一步进行,并将检查 上的methodSignatureForSelector:和forwardInvocation:方法 AOPAspect

  • 在methodSignatureForSelector中:我们返回了已存储在方法包装器中的字典中的正确消息签名 反对

  • 当它到达我们的forwardInvocation实现时:在AOPAspect中,我们有一个完全配置的NSInvocation实例和 我们要做的唯一一件事就是将选择器更改为扩展 我们添加到AOPAspect类的版本。在这里,我们可以运行块 在之前/之后或甚至代替 方法调用。当然,我们可以通过调用 [职业调用]

  • 为简单起见,我们只需将NSInvocation对象传递给为该方法注册的块,这样它们就可以访问所有参数和 通过getArgument:atIndex:and返回值 getReturnValue:方法

  • 就这样。它适用于所有类型的返回类型、参数类型 以及任何不同的论点


    你可以在上面的链接中找到具体的例子。请随意使用。

    对于Objective-C,我建议使用这里常用的类别和代表模式。这些可能比AOP更有用。 不要试图用你为其他语言学习的解决方案来解决你的问题。

    看看这个
    它是alpha版本,目前使用代理实现。它也做依赖注入

    我在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
    

    这个问题由来已久,但我今天发现了这个项目,它可能对未来的人有所帮助


    Stinger是一个高效的库,具有很强的兼容性,对于Objective-C中的aop,使用libffi。

    +1对于total madness来说,这还不够难。@gareth davis如果aop做得好,它可以简化典型的iOS开发人员在其大多数项目中遇到的许多任务。@DASKAjA只是(大部分)Flippent链接的网站上有一个警告:AspectCocoa泄漏内存,导致过大的二进制文件,通常不是可靠的生产质量软件(最好用于调试和检查,然后在编译软件的最终版本之前删除)。上面提供的链接对我不起作用。您可以在以下位置找到:按要求编辑。我已经添加了它背后的主要思想,使用它可以很容易地重新实现。@andras您的AOP回购看起来很好,很短,很简单。您已经有一段时间没有任何提交了,这是否表明它对于生产来说足够稳定?我有兴趣尝试一些东西,比如类别是非常AOP的,但与传统方面相比,它们有一些局限性。例如,您无法继续