ios-基础之【10】-NSTimer
来源:互联网 发布:网王之数据下的温柔 编辑:程序博客网 时间:2024/06/07 16:46
原文链接:http://www.jianshu.com/p/f9999b5958f8
NSTimer怎样保证参数的生命周期
NSTimer可以选择是否重复执行,为了保证NSTimer调用的方法中传递的对象生命周期,NSTimer会对外界传递的对象进行一次retain。
如果是一次性调用的NSTimer,会在本次调用完毕之后invalidate掉NSTimer自身,而NSTimer做retain的对象也会被进行一次release。但是如果是多次重复调用的NSTimer,就需要我们自己在某个特定的时刻来invalidate掉NSTimer,这个invalidate的时刻是根据我们代码情况来自己决定的,否则将会一直存在。
下面的方法我们先创建了一个Object对象,然后添加了一个timer(关于NSTimer和runloop后面再讲),并且进行了一次release,这时object并没有被释放,而是被NSTimer进行了一次retain,我们通过在Object的dealloc方法中打印就可以知道是否被释放。
在本次NSTimer的timer所调用方法调用完毕之后,NSTimer会invalidate自身,而object对象也会被释放。
Object *object = [[Object alloc] init]; [NSTimer scheduledTimerWithTimeInterval:5 target:object selector:@selector(timerAction:) userInfo:nil repeats:NO]; [object release];
而通过下面这种方式创建的timer就不会被NSTimer自动释放,因为这次调用是重复调用,必须我们显示的进行invalidate,NSTimer才会消失,这时obect对象也就会释放了。
Object *object = [[Object alloc] init]; [NSTimer scheduledTimerWithTimeInterval:5 target:object selector:@selector(timerAction:) userInfo:nil repeats:YES]; [object release];
总结:
如果使用重复的NSTimer一定要有对应的invalidate,否则timer会一直存在。
NSTimer会对target对象进行一次retain,所以我们要注意target对象的生命周期。
NSTimer的实时性
无论是单次执行的NSTimer还是重复执行的NSTimer都不是准时的,这与当前NSTimer所处的线程有很大的关系,如果NSTimer当前所处的线程正在进行大数据处理(假设为一个大循环),NSTimer本次执行会等到这个大数据处理完毕之后才会继续执行。
这期间有可能会错过很多次NSTimer的循环周期,但是NSTimer并不会将前面错过的执行次数在后面都执行一遍,而是继续执行后面的循环,也就是在一个循环周期内只会执行一次循环。
无论循环延迟的多离谱,循环间隔都不会发生变化,在进行完大数据处理之后,有可能会立即执行一次NSTimer循环,但是后面的循环间隔始终和第一次添加循环时的间隔相同。
- ios-基础之【10】-NSTimer
- iOS基础之路:NSTimer
- iOS开发基础 - NSTimer
- iOS 之NSTimer倒计时
- iOS开发之NSTimer
- iOS基础之NSTimer 以及通知传递参数
- IOS之NSTimer不一般
- iOS之延时器(NSTimer)
- UI基础学习之(十六):NSTimer
- iOS开发学习之NSTimer失效、NSTimer与runloop之间的关系、解密NSTimer
- IOS开发之关于NSTimer使用
- IOS开发之关于NSTimer使用
- ios开发之NSTimer 详细设置
- iOS开发之关于NSTimer使用
- IOS开发之delegate,NSTimer,UIAlertView
- IOS学习之NSTimer使用详解
- iOS开发之NSTimer使用初探
- iOS开发之NSTimer使用初探
- Android studio1.5.1 NDK配置开发
- LightOJ 1422 Halloween Costumes (区间DP)
- 浅谈虚拟机的基本原理
- Win10 VS2013 Compile Intro - C2011 Error
- 从Eclipse迁移到Android studio(还有遇到的各种问题)
- ios-基础之【10】-NSTimer
- 删除区间内的元素(线性表)
- sql学习笔记(二)
- Java 单链表的反转 以及 双向链表的实现
- Java中的Socket通信
- javaEE SSH框架 BaseAction的抽取以及其他方面代码优化
- JVM-内存分配与回收策略
- 机器学习:核函数的一个小题目
- NVIDIA Jetson TK1 rosrun rviz segmentation fault的解决方法