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
相关文章
- EF循环迭代导致如此严重的性能丢失,你知道?
- 头文件循环引用的错误
- 封装scrollView 循环滚动,tableViewCell(连载) mvc
- 李宏毅机器学习_8_1循环神经网络下
- (《机器学习》完整版系列)第7章 贝叶斯分类器——7.10 EM算法的使用场景及步骤(反复循环执行E步和M步)
- 【JAVA】循环语句实例大全!(源代码招呼!)
- LiveScript 流程控制、循环以及列表推导式
- 排序算法--循环排序(CycleSort)的原理、排序思路、适用场景及代码示例
- PHP的99乘法表三种循环表示
- Swift - 内存泄露原因(循环强引用)及解决办法
- 鸿蒙基础之Unowned 消除循环引用 (HarmonyOS鸿蒙开发基础知识)
- Xcode8的调试技能Memory Graph 实战解决闭包引用循环问题
- 递归快还是循环(迭代)快?
- Node.js:创建应用+回调函数(阻塞/非阻塞)+事件循环
- 性能优化反思:不要在for循环中操作DB
- C语言循环语句入门练习题
- C语言循环语句专项练习题
- [Python]Python 使用 for 循环的小例子
- shell 脚本远程执行for循环的一些问题
- Django工程中使用echarts怎么循环遍历显示数据
- Swift - 条件语句和循环语句
- 数据结构_链表(单链表,单向循环链表,双链表)
- c# 并行计算(大量循环处理的场景下)
- 【转载】angular监听dom渲染完成,判断ng-repeat循环完成
- 07数据结构与算法分析之---循环链表
- vue 实现表格循环滚动 vue-seamless-scroll插件的安装与使用