弱引用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
  • 4959

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

一般我们在开发过程中,会用过定时器timer的功能。一般会用以下两程方式: NSObject API- (void)performSelector:(SEL)aSelector withObject:...

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

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

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

Java中的4种对象引用类型,按照级别从高到低分别为:强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PlantomRef...

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

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

Java 对象的强引用、软引用、弱引用和虚引用

以下内容部分来自 疯狂Java讲义/李刚 ,博客仅用于个人笔记及帮助他人用途,无任何商业目的,如有侵权,请联系作者删除。 对大部分对象而言,程序里会有一个引用变量引用该对象,这是最常见的引用方式。除此...

对象的强引用和弱引用

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

Java对象引用方式-强引用、软引用、弱引用和虚引用

Java中负责内存回收的是JVM。通过JVM回收内存,我们不需要像使用C语音开发那样操心内存的使用,但是正因为不用操心内存的时候,也会导致在内存回收方面存在不够灵活的问题。为了解决内存操作不灵活的问题...

Java 对象引用:强引用、软引用、弱引用和虚引用

在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保...
  • ak913
  • ak913
  • 2012年02月02日 14:47
  • 484

Java中对于对象的强引用、软引用、弱引用以及虚引用的区别

转载:http://blog.csdn.net/lengyuhong/article/details/6398184 众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:弱引用NSTimer对象
举报原因:
原因补充:

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