美文网首页
NSProxy使用解除循环引用

NSProxy使用解除循环引用

作者: 哦小小树 | 来源:发表于2020-04-22 20:36 被阅读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;
}

相关文章

网友评论

      本文标题:NSProxy使用解除循环引用

      本文链接:https://www.haomeiwen.com/subject/mcfgihtx.html