码迷,mamicode.com
首页 > 其他好文 > 详细

NSTimer解除循环引用

时间:2015-06-09 17:11:03      阅读:150      评论:0      收藏:0      [点我收藏+]

标签: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


NSTimer解除循环引用

标签:nstimer   强引用   

原文地址:http://blog.csdn.net/jinangzhu/article/details/46428539

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!