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

NSTimer解除循环引用

时间:2017-05-30 20:47:56      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:内存   timer   dea   assign   object   userinfo   class   str   nonatomic   

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解除循环引用

标签:内存   timer   dea   assign   object   userinfo   class   str   nonatomic   

原文地址:http://www.cnblogs.com/gavanwanggw/p/6921065.html

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