OC知识--NSProxy

NSProxy是一个类似于NSObject的根类。

NS_ROOT_CLASS
@interface NSProxy {
    Class   isa;
}

NSProxy实现了包括NSObject协议在内基类所需的基础方法,但是作为一个抽象的基类并没有提供初始化的方法。它接收到任何自己没有定义的方法他都会产生一个异常,所以一个实际的子类必须提供一个初始化方法或者创建方法,并且重载forwardInvocation:方法和methodSignatureForSelector:方法来处理自己没有实现的消息。

主要用途AOP

@interface MyProxy : NSProxy {
    id _object;
}
+ (id)proxyForObject:(id)obj;
@end

@implementation MyProxy
+ (id)proxyForObject:(id)obj {
    MyProxy *instance = [MyProxy alloc];
    instance->_object = obj;
    return instance;
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
    return [_object methodSignatureForSelector:sel];
}
- (void)forwardInvocation:(NSInvocation *)invocation {
    if ([_object respondsToSelector:invocation.selector]) {
        NSString *selectorName = NSStringFromSelector(invocation.selector);
        
        NSLog(@"Before calling \"%@\".", selectorName);
        [invocation invokeWithTarget:_object];
        NSLog(@"After calling \"%@\".", selectorName);
    }
}
@end
#import 
#import "MyProxy.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString *string = [MyProxy proxyForObject:@"www.baiduc.com"];
        NSLog(@"%@", @(string.length));

        NSLog(@"%@", [string substringFromIndex:3]);
    }
    return 0;
}

打印信息:

  • before calling:length
  • after calling:length
  • 13
  • before calling:substringFromIndex:
  • after calling:substringFromIndex:
  • .baidu.com

1.可以拦截修改MyProxy里的_object信息,

2.也可以在出发_object的方法前后做埋点统计

你可能感兴趣的:(OC知识点)