NSProxy使用解除循环引用
2020-04-22 本文已影响0人
哦小小树
0x01 NSProxy用处
一个协议,用于消息转发,可以用来解除循环引用。
0x02 构建弱引用关联类
#import "WeakObject.h"
@interface WeakObject ()
@property (nonatomic, weak) id target;
@end
@implementation WeakObject
+ (instancetype)proxyWithTarget:(id)target {
WeakObject *instance = [self alloc];
instance.target = target;
return instance;
}
- (BOOL)respondsToSelector:(SEL)aSelector {
return [self.target respondsToSelector:aSelector];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
if ([self.target respondsToSelector:sel]) {
return [self.target methodSignatureForSelector:sel];
}
return nil;
}
- (void)forwardInvocation:(NSInvocation *)invocation {
SEL selector = invocation.selector;
if ([self.target respondsToSelector:selector]) {
[invocation invokeWithTarget:self.target];
}
}
@end
0x03 CADisplayLink解除循环引用示例
// 构建runloop, target进行封装避免循环引用
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:[WeakObject proxyWithTarget:self] selector:@selector(tick:)];
[link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
self.link = link;
- (void)invalidLink { // 使displayLink失效,从runloop中移除
[self.link invalidate];
self.link = nil;
}