美文网首页
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