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循环,但是后面的循环间隔始终和第一次添加循环时的间隔相同。

0 0
原创粉丝点击