弱引用NSTimer对象

翻译 2015年07月09日 23:12:51
      

不要忘记 NSTimer 会 retain它的对象,意味着如果你的timer的 target 也是 NSTimer的 拥有者的时候,很容易就进入一个循环引用。

你可以通过一个 代理的delegate来 绕过这个, 这个代理对象拥有这个真正target的 weak 引用。 


@interface TMWeakTimerTarget : NSObject


- (instancetype)initWithTarget:(id)target selector:(SEL)selector;


- (void)timerDidFire:(NSTimer *)timer;


@end


@interface TMWeakTimerTarget()


@property (nonatomic, weak) id target;

@property (nonatomic) SEL selector;


@end


@implementation TMWeakTimerTarget


#pragma mark - Initialization


- (instancetype)initWithTarget:(id)target selector:(SEL)selector {

    if (self = [super init]) {

        _target = target;

        _selector = selector;

    }


    return self;

}


- (id)init {

    return [self initWithTarget:nil selector:nil];

}


#pragma mark - TMWeakTimerTarget


- (void)timerDidFire:(NSTimer *)timer {

    if (self.target) {

        // `performSelector:` would generate a potential leak warning (http://stackoverflow.com/a/7073761/503916)

        objc_msgSend(self.target, self.selector);

    }

    else {

        [timer invalidate];

    }

}


@end


你可以创建一个 NSTimer的 Category ,来更容易的使用这个类

/**

 *  Method that can be used in favor of `scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:` in case the target retains the timer instance. Using the aforementioned method would create a retain cycle in this case.

 */

@interface NSTimer (RetainCyclePrevention)


+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)timeInterval 

                                 weakTarget:(id)target 

                                   selector:(SEL)selector 

                                   userInfo:(id)userInfo 

                                    repeats:(BOOL)yesOrNo;


@end


@implementation NSTimer (RetainCyclePrevention)


+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)timeInterval 

                                 weakTarget:(id)target 

                                   selector:(SEL)selector 

                                   userInfo:(id)userInfo 

                                    repeats:(BOOL)yesOrNo {

    return [self scheduledTimerWithTimeInterval:timeInterval 

                                         target:[[TMWeakTimerTarget alloc] initWithTarget:target 

                                                                                 selector:selector] 

                                       selector:@selector(timerDidFire:) 

                                       userInfo:userInfo 

                                        repeats:yesOrNo];

}


@end


NSTimer和实现弱引用的timer的方式

NSTimer 弱引用 Objective-C
  • yohunl
  • yohunl
  • 2016年01月31日 22:44
  • 5524

表示弱引用,即在引用对象的同时仍然允许垃圾回收来回收该对象。

表示弱引用,即在引用对象的同时仍然允许垃圾回收来回收该对象。
  • wlanye
  • wlanye
  • 2014年11月25日 14:10
  • 1187

iOS如何在数组中使用弱引用(weak reference)

https://yq.aliyun.com/articles/29434 NSPointerArray的用处 摘要: NSPointerArray的用处   1. 说明 也许你...
  • jeffasd
  • jeffasd
  • 2017年03月07日 18:27
  • 1601

NSTimer和实现弱引用的timer的方式

如下代码所示,是我们最常见的使用timer的方式 C++ @property (nonatomic , strong) NSTimer *animationTimer; self.an...
  • tongwei1987
  • tongwei1987
  • 2016年03月15日 16:42
  • 147

防止NSTimer和调用对象之间的循环引用

一般我们在开发过程中,会用过定时器timer的功能。一般会用以下两程方式: NSObject API- (void)performSelector:(SEL)aSelector withObject:...
  • kebing1011
  • kebing1011
  • 2015年07月20日 21:29
  • 3336

关于"栈"对象弱引用的线程安全问题

在c++中,使用弱引用可以检测
  • Skilla
  • Skilla
  • 2014年11月10日 10:01
  • 1555

对象的强引用和弱引用

如何保证一个对象在释放后不会再被访问? 最简单的是使用带引用计数的智能指针,但是强引用会导致对象不会被释放。那么弱引用如何?弱引用允许对象被释放,弱引用必须先转成强引用才能对对象进行操作,如果转换失败...
  • klarclm
  • klarclm
  • 2012年04月17日 18:39
  • 791

Java中的4种对象引用类型:强引用、软引用、弱引用和虚引用

Java中的4种对象引用类型,按照级别从高到低分别为:强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PlantomRef...
  • reakingf
  • reakingf
  • 2016年05月16日 22:05
  • 2144

java对象的强引用,软引用,弱引用和虚引用

众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样操心内存),但同时也是它的缺点(不够灵活)。为了解决内存操作不灵活这个问题,可以采用软引用等方法。 ...
  • new_abc
  • new_abc
  • 2015年06月17日 14:19
  • 1081

java对象的强引用,软引用,弱引用和虚引用

   众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样操心内存),但同时也是它的缺点(不够灵活)。为了解决内存操作不灵活这个问题,可以采用软引用等...
  • gongxunqiang005
  • gongxunqiang005
  • 2016年07月28日 11:50
  • 101
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:弱引用NSTimer对象
举报原因:
原因补充:

(最多只允许输入30个字)