iOS

iOS中的NSProxy

2018-07-19  本文已影响25人  伶俐ll

NSProxy是和NSObject同级的一个类,可以说它是一个虚拟类,它只是实现了<NSObject>的协议,用来专门做消息转发。
详见如下代码:

//LZProxy.h
#import <Foundation/Foundation.h>

@interface LZProxy : NSProxy
+ (instancetype)proxyWithTarget:(id)target;
@property (weak, nonatomic) id target;
@end
#import "LZProxy.h"

@implementation MJProxy

+ (instancetype)proxyWithTarget:(id)target
{
    // NSProxy对象不需要调用init,因为它本来就没有init方法
    MJProxy *proxy = [MJProxy alloc];
    proxy.target = target;
    return proxy;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
    return [self.target methodSignatureForSelector:sel];
}

- (void)forwardInvocation:(NSInvocation *)invocation
{
   //可以在这里拦截方法的参数返回值等相关信息,具体Runtime那篇文章有详细介绍
    [invocation invokeWithTarget:self.target];
}
@end
#import "ViewController.h"
#import "LZProxy.h"

@interface ViewController ()
@property (strong, nonatomic) NSTimer *timer;
@property (strong, nonatomic) CADisplayLink *link;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
   // 保证调用频率和屏幕的刷帧频率一致,60FPS
    self.link = [CADisplayLink displayLinkWithTarget:[LZProxy proxyWithTarget:self] selector:@selector(linkTest)];
    [self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[LZProxy proxyWithTarget:self] selector:@selector(timerTest) userInfo:nil repeats:YES];
}

- (void)timerTest
{
    NSLog(@"%s", __func__);
}
- (void)linkTest
{
    NSLog(@"%s", __func__);
}

- (void)dealloc
{
    NSLog(@"%s", __func__);
    [self.timer invalidate];
}

@end

另:分析下面程序的打印结果

ViewController *vc = [[ViewController alloc] init];
LZProxy *proxy = [LZProxy proxyWithTarget:vc];
NSLog(@"%d", [proxy isKindOfClass:[ViewController class]]);  //1
上一篇 下一篇

猜你喜欢

热点阅读