NSTimer解除循环引用

NSTimer作为一个经常使用的类,却有一个最大的弊病,就是会强引用target。造成调用timer很麻烦。稍有不慎就造成内存泄漏。

下面就是为解决问题做的封装。

直接上代码:

#import <Foundation/Foundation.h>

@interface LZLTimer :
NSObject

-(void)startTimerInterval:(NSTimeInterval)ti target:aTarget selector:(SEL)selector
userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

@end

#import "LZLTimer.h"

@interface LZLWeakTimerTarget :
NSObject

@property (nonatomic,weak)
id target;

@property (nonatomic,assign)
SEL selector;

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

@end

@implementation LZLWeakTimerTarget

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

if(_target) {

//消除arc警告

IMP imp = [_target
methodForSelector:_selector];

if ([NSStringFromSelector(_selector)
hasSuffix:@":"]) {

void (*func)(id,
SEL, id) = (void *)imp;

func(_target,
_selector, timer);

}else {

void (*func)(id,
SEL) = (void *)imp;

func(_target,
_selector);

}

} else {

[timer invalidate];

}

}

@end

@interface LZLTimer () {

NSTimer *_timer;

}

@end

@implementation LZLTimer

-(void)dealloc {

if (_timer!=nil) {

[_timer
invalidate];

_timer =
nil;

}

}

-(void)startTimerInterval:(NSTimeInterval)ti target:aTarget selector:(SEL)selector
userInfo:(id)userInfo repeats:(BOOL)yesOrNo {

if (nil ==
_timer) {

WMWeakTimerTarget *weakTarget = [[WMWeakTimerTarget
alloc] init];

weakTarget.target = aTarget;

weakTarget.selector = selector;

_timer = [NSTimer
scheduledTimerWithTimeInterval:ti
target:weakTarget selector:@selector(timerDidFire:)
userInfo:userInfo repeats:yesOrNo];

}

}

@end

时间: 2024-10-03 01:01:38

NSTimer解除循环引用的相关文章

NSTimer与循环引用

代码: #import "ViewController.h" @interface ViewController () @property (strong, nonatomic) NSTimer *timer; - (void)doSomething:(NSTimer *)timer; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 编程提示 // A timer mai

iOS 里面 NSTimer 防止 循环引用

使用NSTimer的类 #import "TBTimerTestObject.h" #import "TBWeakTimerTarget.h" @interface TBTimerTestObject() @property (nonatomic, weak) NSTimer *timer; @end @implementation TBTimerTestObject - (void)dealloc { NSLog(@"timer is dealloc&q

如何解除循环引用

定义block的时候,会对外部变量做一次copy,会对self进行强引用 1.__weak是ios 5.0 推出的 __weak 相当于weak 本身是弱引用,但是如果对象被释放,执行的地址会指向nil 更安全 __weak typeof(self) weakSelf = self; 2__unsafe_unretained 是ios4.0 推出的,相当于assign,不会做强引用,但是日过对象被释放,内存地址保持不变,如果此时在调用,快就会出现野指针错误 MRC经典错误,EXC_BAD_ACC

ios block常见的错误(二)——循环引用

这篇博文继续block的常见错误--循环引用. 循环引用是很多初学者不能察觉的,其产生的原因,是block中的代码会对对象进行强引用. 读者请阅读示例代码1,并思考示例代码1所创建的对象能否被正常销毁? 示例代码1: * mark 将代码改为调用self的方法 -(NSMutableArray * (_myBlocks ===-=(^sum)(, ) = ^( x,  mark 对象被释放时自动调用 - ( 结果是不能正常释放的.读者不妨在xcode中试试. 产生原因在block代码中出现了se

使用gc、objgraph干掉python内存泄露与循环引用!

Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问题:内存泄露与循环引用.内存泄露是让所有程序员都闻风丧胆的问题,轻则导致程序运行速度减慢,重则导致程序崩溃:而循环引用是使用了引用计数的数据结构.编程语言都需要解决的问题.本文揭晓这两个问题在python语言中是如何存在的,然后试图利用gc模块和objgraph来解决这两个问题. 注意:本文的目标是Cpyth

解决NSTimer或CADisplayLink计时器造成的循环引用问题。

众所周知,我们在使用NSTimer或者CADisplayLink的时候,经常会导致引用它们的类不能正常释放,那是因为引用它们的类与它们之间产生了循环引用.看以下代码: self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(runTimer) userInfo:nil repeats:YES]; self.displayLink = [CADisplayLink display

iOS容易造成循环引用的三种场景NSTimer以及对应的使用方法(一)

NSTimer A timer provides a way to perform a delayed action or a periodic action. The timer waits until a certain time interval has elapsed and then fires, sending a specified message to a specified object(timer就是一个能在从现在开始的未来的某一个时刻又或者周期性的执行我们指定的方法的对象)

初识iOS NSTimer 循环引用不释放问题

原文转自 :http://www.codecate.com/code/?p=77 最近开发遇到NSTimer Target 造成循环引用问题,不释放,以下是解决方案. stackoverflow上的一个解决方案 http://stackoverflow.com/questions/16821736/weak-reference-to-nstimer-target-to-prevent-retain-cycle 原文如下 Weak Reference to NSTimer Target To Pr

用block解决nstimer循环引用

大多数开发者可能都会这样来实现定时器.创建定时器的时候,由于目标对象是self,所以要保留此实例.然而,因为定时器是用实例变量存放的,所以实例也保留了定时器,这就造成了循环引用.除非调用stop方法,或者系统回收实例,才能打破循环引用,如果无法确保stop一定被调用,就极易造成内存泄露.当指向XXClass实例的最后一个外部引用移走之后,该实例仍然会继续存活,因为定时器还保留着它.而定时器对象也不可能被系统释放,因为实例中还有一个强引用正在指向它.这种内存泄露是很严重的,如果定时器每次轮训都执行