美文网首页
iOS-NSTimer强引用

iOS-NSTimer强引用

作者: linbj | 来源:发表于2017-12-15 13:32 被阅读17次
@property (nonatomic , strong) NSTimer *animationTimer;
self.animationTimer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(animationTimerDidFired:) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:self.animationTimer forMode:NSRunLoopCommonModes];

当使用如上代码创建一个NSTimer之后会出现一个VC-> NSTimer->VC的循环引用。导致界面不能释放。

解决方法就是让其中某一部分变成弱引用。
YYKit中提供了YYWeakProxy这个类来解决NSTimer或CADisplayLink的强引用问题

YYWeakProxy 继承自NSProxy

消息转发机制

声明了一个

@property (nullable, nonatomic, weak, readonly) id target;

手动将传入的参数变成弱引用。

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface YYWeakProxy : NSProxy

@property (nullable, nonatomic, weak, readonly) id target;

- (instancetype)initWithTarget:(id)target;

+ (instancetype)proxyWithTarget:(id)target;

@end

NS_ASSUME_NONNULL_END



#import "YYWeakProxy.h"


@implementation YYWeakProxy

- (instancetype)initWithTarget:(id)target {
    _target = target;
    return self;
}

+ (instancetype)proxyWithTarget:(id)target {
    return [[YYWeakProxy alloc] initWithTarget:target];
}

// 上图可见当找不到对应SEL的时候执行此方法,手动返回self,开始执行方法
- (id)forwardingTargetForSelector:(SEL)selector {
    return _target;
}

// 对所有的不能处理的都传递给_target了,理论上是不需要写下面两个方法的,但是因为target 是weak引用的,所以还是写了下面两个方法,防止crash。

- (void)forwardInvocation:(NSInvocation *)invocation {
    void *null = NULL;
    [invocation setReturnValue:&null];
}


- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
    return [NSObject instanceMethodSignatureForSelector:@selector(init)];
}

- (BOOL)respondsToSelector:(SEL)aSelector {
    return [_target respondsToSelector:aSelector];
}

- (BOOL)isEqual:(id)object {
    return [_target isEqual:object];
}

- (NSUInteger)hash {
    return [_target hash];
}

- (Class)superclass {
    return [_target superclass];
}

- (Class)class {
    return [_target class];
}

- (BOOL)isKindOfClass:(Class)aClass {
    return [_target isKindOfClass:aClass];
}

- (BOOL)isMemberOfClass:(Class)aClass {
    return [_target isMemberOfClass:aClass];
}

- (BOOL)conformsToProtocol:(Protocol *)aProtocol {
    return [_target conformsToProtocol:aProtocol];
}

- (BOOL)isProxy {
    return YES;
}

- (NSString *)description {
    return [_target description];
}

- (NSString *)debugDescription {
    return [_target debugDescription];
}

@end

相关文章

  • iOS-NSTimer强引用

    当使用如上代码创建一个NSTimer之后会出现一个VC-> NSTimer->VC的循环引用。导致界面不能释放。 ...

  • Java四大引用

    Java四大引用:强引用,软引用,弱引用,虚引用。 一、强引用: 1、= new出来的对象就是强引用,强引用在任何...

  • Java的四种对象引用类型

    Java的四种对象引用类型:强引用、弱引用、软引用、虚引用。 强引用(StrongReference): 强引用是...

  • (转载)Java 7之基础 - 强引用、弱引用、软引用、虚引用

    (转载)Java 7之基础 - 强引用、弱引用、软引用、虚引用 1、强引用(StrongReference) 强引...

  • Java中的几种引用

    强引用,弱引用,软引用,虚引用。 强引用的含义:强引用是最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回...

  • Android 强、软、弱、虚引用 区别和使用场景

    标签:Android 强引用 关于强引用的使用场景 强引用的介绍 强引用是我们使用最频繁的,如果一个对象具有强引用...

  • JAVA 强、软、弱、虚快速理解区别

    JAVA中类型引用分为:强引用、软引用、弱引用、虚引用 强引用 强引用,GC默认不回收,只有在对象没有被引用的时候...

  • IOS 内存管理

    引用类型 强引用强引用是默认的引用类型,被强引用的内存不会被释放,强引用的引用计数会+1,从而扩展对象的生命周期 ...

  • 1-Java引用详解

    Java引用详解 强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃...

  • Android温故而知新-Java的四种引用

    java对象的引用包括强引用,软引用,弱引用,虚引用四种 强引用 强引用是最常用的引用,我们在代码中处处可见: 上...

网友评论

      本文标题:iOS-NSTimer强引用

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