我可以用发送参数@selector
中NSTimer
? 如果我想发布NSTimer
,有以下步骤权dealloc
?
[timer invalidate];
[timer release];
我可以用发送参数@selector
中NSTimer
? 如果我想发布NSTimer
,有以下步骤权dealloc
?
[timer invalidate];
[timer release];
[timer release]
只需要被调用,如果你“自己”的计时器。 从苹果公司的文档:
由于运行循环保持定时,从存储管理的角度通常没有必要保持参照计时器一旦你安排吧。 由于定时器在当指定其方法作为选择参数传递,可以无效的重复计时器适当的时候该方法之内。 在许多情况下,但是,你也想在无效的选项定时器或许它甚至开始之前。 在这种情况下,你需要一个参考保持到了计时器,所以,只要是合适的,你可以把它的无效信息。 如果您创建一个计划外的定时器(见“未调度定时器” ),那么你必须保持强大的参考计时器(在引用计数的环境中,你保留它),这样你使用它之前,它不释放。
这是什么意思?
如果您alloc
和init
一个计时器,还必须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;
或者,如果计时器没有设置重复,你会怎么做绝对什么都没有,因为它的第一次调用之后被释放。
这两种方法做不同的事情。 如果你拥有一个计时器(你保留它,或者它alloced,或复制它),那么你应该将其释放。 如果你计划它在一个运行循环,则必须使它无效的运行循环将其释放。 如果你做了两件事,那么你就必须释放和无效定时器(但通常具有运行循环拥有定时器就足够了)。
始终,释放你做的最后一件事。 一旦你发布的东西也不能保证它是安全的,取消引用的对象,这意味着它不再安全发送的任何消息。
这是解除对其可能仍在运行的定时器的正确方法(要停止)。