当前位置:网站首页>Object-C programming tips timer "suggestions collection"
Object-C programming tips timer "suggestions collection"
2022-07-07 20:44:00 【Full stack programmer webmaster】
Hello everyone , I meet you again , I'm the king of the whole stack .
object-c Timer
object-c The timer will take the initiative retain Current user , Suppose you don't pay attention to calling invalidate, It's very easy Cause a circular reference and cause a memory leak . The following ideas provide a set of feasible solutions .
give an example :
Often in viewController There may be a need to refresh the interface on your own initiative . After data acquisition fails . every other 10 Take the initiative to refresh and get data again in seconds , At this time NSTimer Is a very convenient thing . In general, create a NSTimer Of repeat object , Then realize the corresponding timerFireMethod Method . When the user actively clicks back button When , This interface should be released . But because NSTimer retain The current viewController, Cause interface memory leak . You might say in dealloc Call in invalidate, But it must be clear dealloc You won't call , Of course viewDidDisappear Also won't be called .
I saw it some time ago effective object-c, Learned a very good idea , Now share it .
to NSTimer Add a category , Use block Way of transmission timerFireMethod. The code is as follows :
@implementation NSTimer(LPBLocks)
+(NSTimer*) lpScheduleTimerWithTimerInternal:(NSTimeInterval)interval
block:(void(^)())block
repeats:(BOOL)repeats
{
return [self scheduledTimerWithTimeInterval:interval target:self selector:@selector(lpTimerBlockInvoke:) userInfo:[block copy] repeats:repeats];
}
+(void)lpTimerBlockInvoke:(NSTimer*)timer
{
void(^block)() = timer.userInfo;
if(block){
block();
}
}
@endThis scheduledTimer The method will also retain target, But because this is a class method . It retains class objects , So there will be no problem .
It passes in the to run block, And then in the callback function through userInfo obtain block, And run .
improvement :
This is already a very big improvement . We can safely pass in the code block Code . Just think carefully . Suppose that block Introduced in viewController Members of , also timer It also exists as a member variable in viewController in .
For example, the following code :
@interface LPNextViewController ()
{
NSTimer* refreshTimer;
}such viewController and refreshTimer Fell into the logical circle of circular reference again . Of course, it can be in block Use in weak_self Avoid circular references , But writing code is always a little difficult . And it also needs to be explicitly done by external users .
So very easy The thought of . It should be encapsulated in a special LPTimer Class . It is responsible for holding NSTimer. At the same time NSTimer Of block Use LPTimer Of weak Version number .
@interface LPTimer ()
{
NSTimer* _pollTimer;
//timer selector
__weak id _weak_target;
SEL _selector;
id _userInfo;
}
@end-(void)scheduleTimerWithTimerInternal:(NSTimeInterval)interval
target:(id)target
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)repeats
{
__weak id weak_self = self;
_weak_target = target;
_selector = aSelector;
_userInfo = userInfo;
// Borrow the first version number block thought
// The second layer of indirection is used , call _weak_target Of aSelector Method .
// This can make stopTimer Put it in the box . External management is not necessary timer Of stop.
_pollTimer = [NSTimer lpScheduleTimerWithTimerInternal:1 block:^{
[weak_self doTimer];
} repeats:repeats];
}The above code LPTimer hold NSTimer object . and NSTimer Running block It uses weak_self.
It's in timer When triggered, call its own doTimer Method . stay doTimer Is responsible for passing methods to external users .
-(void)doTimer
{
if ([_weak_target respondsToSelector:_selector]) {
[_weak_target performSelector:_selector withObject:self];
}
else{
DLog(@"WARNNING: unknown selector");
}
}_weak_target Is an external user . External users can put LPTimer Just regard it as an ordinary object , There's nothing wrong with holding it . LPTimer Keep a weak reference to the external user . When the time comes timer When triggered , It will be transferred to NStimer Of block in . Then pass it on to LPTimer Of doTimer in . And then call to _weak_target Of selector in .
Attention must be paid to release NStimer object , stay LPTimer Call when releasing NSTimer Of invalidate Method .
-(void)stopTimer
{
DLog(@"");
[_pollTimer invalidate];
}
-(void)dealloc
{
[self stopTimer];
DLog(@"");
}in fact . Users are using LPTimer class , Then let LPTimer Performance and NSTimer Your behavior is exactly the same , Using the combined adapter mode can be easily done .
summary :
The main idea is NSTimer Meeting retain An object , Now let it retain Class object .
When the time comes to trigger , from NSTimer Class object triggers to Block in . Then trigger to the external LPTimer Ordinary objects .
We can deal with ordinary objects freely . Use weak_target send LPTimer Weak references to external users , Disconnect external users from LPTimer The associated .
Use weak_self To break off LPTimer And NStimer Circular correlation of . I think it's a good idea , Welcome to discuss if necessary .
Publisher : Full stack programmer stack length , Reprint please indicate the source :https://javaforall.cn/116393.html Link to the original text :https://javaforall.cn
边栏推荐
- 开发一个小程序商城需要多少钱?
- Referrer和Referrer-Policy简介
- 4G设备接入EasyGBS平台出现流量消耗异常,是什么原因?
- Cantata9.0 | 全 新 功 能
- Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
- VMWare中虚拟机网络配置
- You want to kill a port process, but you can't find it in the service list. You can find this process and kill it through the command line to reduce restarting the computer and find the root cause of
- Codesonar enhances software reliability through innovative static analysis
- 不落人后!简单好用的低代码开发,快速搭建智慧管理信息系统
- 神兵利器——敏感文件发现工具
猜你喜欢

The latest version of codesonar has improved functional security and supports Misra, c++ parsing and visualization

Cantata9.0 | 全 新 功 能

【OpenCV 例程200篇】223. 特征提取之多边形拟合(cv.approxPolyDP)

使用高斯Redis实现二级索引

C语言 整型 和 浮点型 数据在内存中存储详解(内含原码反码补码,大小端存储等详解)

Mongodb learn from simple to deep

OneSpin 360 DV新版发布,刷新FPGA形式化验证功能体验

Make this crmeb single merchant wechat mall system popular, so easy to use!

H3C S7000/S7500E/10500系列堆叠后BFD检测配置方法

Implement secondary index with Gaussian redis
随机推荐
Codeforces Round #296 (Div. 2) A. Playing with Paper[通俗易懂]
awk处理JSON处理
恶魔奶爸 B2 突破语法,完成正统口语练习
如何满足医疗设备对安全性和保密性的双重需求?
Spark 判断DF为空
【网络原理的概念】
【论文阅读】MAPS: Multi-agent Reinforcement Learning-based Portfolio Management System
写了个 Markdown 命令行小工具,希望能提高园友们发文的效率!
Cantata9.0 | new features
Codesonar Webinar
Mongodb learn from simple to deep
HDU4876ZCC loves cards(多校题)
开发那些事儿:Go加C.free释放内存,编译报错是什么原因?
部署、收回和删除解决方式—-STSADM和PowerShell「建议收藏」
有用的win11小技巧
备份 TiDB 集群到持久卷
C language helps you understand pointers from multiple perspectives (1. Character pointers 2. Array pointers and pointer arrays, array parameter passing and pointer parameter passing 3. Function point
测量楼的高度
JNI 初级接触
I wrote a markdown command line gadget, hoping to improve the efficiency of sending documents by garden friends!