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;
}
上一篇 下一篇

猜你喜欢

热点阅读