NSProxy实现AOP方便为ios应用实现异常处理策略

前段时间关注过objc实现的AOP。在GitHub找到了其中的两个库:AOP-in-Objective-C 和 AOP-for-Objective-C第一个是基于NSProxy来实现的;第二个是基于GCD以及block实现的;两者都使用了Cocoa的运行时编程技术,将拦截器注入给代理对象,使其干涉真是对象的执行顺序从而达到给代码增加“切面”的目的,这里的模式就是通常的代理模式。因为时间关系,暂时只
摘要由CSDN通过智能技术生成

前段时间关注过objc实现的AOP

在GitHub找到了其中的两个库:AOP-in-Objective-CAOP-for-Objective-C

第一个是基于NSProxy来实现的;第二个是基于GCD以及block实现的;

两者都使用了Cocoa的运行时编程技术,将拦截器注入给代理对象,使其干涉真是对象的执行顺序从而达到给代码增加“切面”的目的,这里的模式就是通常的代理模式。

因为时间关系,暂时只看了第一个库的代码,下面简短地分析一下。

NSProxy:如其名,它出现的目的就是为了来“代理”一个真实对象的。这是Foundation库的内置实现。大部门人都知道NSObject是通常Cocoa中的根类,没错,但其实根类并不止一个,NSProxy也是跟NSObject的根类,只是它是个抽象类并且不是用于通常意义上的编程目的,所以不是那么广为人知(事实上我也是今天才知道)。并且NSObject看到它你以为它是个类。但今天看NSProxy定义的时候,我发现它的头文件里是这样定义的:

@interface NSProxy <NSObject>

开始我很莫名其妙,如果是继承自NSObject的话,应该是个冒号。这种写法明显就是实现协议的写法啊。于是,查看了一下资料,果然还有个NSObject的协议,并且NSObject类自身也实现了NSObject协议。具体资料请看 这篇文章

NSProxy与NSObject一虚一实,并且它们都实现了NSObject协议。这让NSProxy的实现类能够很好地“代理”NSObject子类,并且把NSObject协议抽象出来,也让他们能够共享某些行为。

来看看它是如何工作的(测试代码见AOPLibTest.m文件):

在你需要使用AOP的地方,你首先需要实例化一个对象,比如你需要实例化一个NSMutableArray,你需要使用AOPProxy来实例化它:

NSMutableArray* testArray = (NSMutableArray*)[[AOPProxy alloc] initWithNewInstanceOfClass:[NSMutableArray class]];

这里,其实是间接实例化。它提供了一个接口,你把你的类名传给它,由它给你实例化。事实上,这是一种注入方式,而看完这个方法的定义你就会看到其实它返回给你的并不是NSMutableArray的一个实例(其实是AOPProxy,而 它们之所以能互相强制转换是因为他们都实现了NSObject协议):

- (id) initWithNewInstanceOfClass:(Class) class {

    // create a new instance of the specified class
    id newInstance = [[class alloc] init];

    // invoke my designated initializer
    [self initWithInstance:newInstance];

    // release the new instance
    [newInstance release];

    // finally return the configured self
    return self;
}

上面的self指代的就是AOPProxy,其中的initWithInstance方法:

- (id) initWithInstance:(id)anObje
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值