什么是(的NSTimer释放和无效)的第一步?(what is the first step in

2019-07-30 16:09发布

我可以用发送参数@selectorNSTimer ? 如果我想发布NSTimer ,有以下步骤权dealloc

[timer invalidate];
[timer release];

Answer 1:

[timer release]只需要被调用,如果你“自己”的计时器。 从苹果公司的文档:

由于运行循环保持定时,从存储管理的角度通常没有必要保持参照计时器一旦你安排吧。 由于定时器在当指定其方法作为选择参数传递,可以无效的重复计时器适当的时候该方法之内。 在许多情况下,但是,你也想在无效的选项定时器或许它甚至开始之前。 在这种情况下,你需要一个参考保持到了计时器,所以,只要是合适的,你可以把它的无效信息。 如果您创建一个计划外的定时器(见“未调度定时器” ),那么你必须保持强大的参考计时器(在引用计数的环境中,你保留它),这样你使用它之前,它不释放。

这是什么意思?

如果您allocinit一个计时器,还必须release它,就像这样:

NSTimer * timer = [[NSTimer alloc] initWith...];

NSRunLoop * runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
[timer release];

...
...

[timer invalidate];
timer = nil;

一旦定时器被添加到运行循环,没有理由保持对它的引用了,因为跑环拥有它。 在这种情况下,如图所示,你会release ,只要你把它添加到运行循环定时器,然后简单地invalidate它,当你完成。 最后一行(设置定时器nil )是出于安全考虑。 要将呼叫invalidate将导致定时器被释放(在运行循环),所以它是不安全的,保持一个指向它的引用。 设置本地参考nil让事情变得洁净。

但是,如果您创建一个使用的方便的方法,像这样一个计时器:

NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval ...];

并不需要调用[timer release]在所有! 便利方法添加定时器运行循环,然后拥有它,所以你不需要返回计时器对象上执行任何的内存管理。 您只需invalidate计时器,当你不再想使用它:

[timer invalidate];
timer = nil;

或者,如果计时器没有设置重复,你会怎么做绝对什么都没有,因为它的第一次调用之后被释放。



Answer 2:

这两种方法做不同的事情。 如果你拥有一个计时器(你保留它,或者它alloced,或复制它),那么你应该将其释放。 如果你计划它在一个运行循环,则必须使它无效的运行循环将其释放。 如果你做了两件事,那么你就必须释放和无效定时器(但通常具有运行循环拥有定时器就足够了)。



Answer 3:

始终,释放你做的最后一件事。 一旦你发布的东西也不能保证它是安全的,取消引用的对象,这意味着它不再安全发送的任何消息。



Answer 4:

这是解除对其可能仍在运行的定时器的正确方法(要停止)。



文章来源: what is the first step in (NSTimer release and invalidate)?