(NSTimer发布和无效)的第一步是什么?

5 iphone nstimer

我公司可以派的说法与@selectorNSTimer?如果我想发布NSTimer,请执行以下步骤dealloc吗?

[timer invalidate];
[timer release];
Run Code Online (Sandbox Code Playgroud)

e.J*_*mes 15

[timer release]只有你"拥有"计时器才需要被调用.来自Apple的文档:

因为运行循环维护计时器,所以从内存管理的角度来看,一旦计划完毕,通常不需要保留对计时器的引用.由于在将方法指定为选择器时将计时器作为参数传递,因此可以在该方法中适当时使重复计时器无效.但是,在许多情况下,您还需要选择使计时器失效 - 甚至可能在启动之前.在这种情况下,您需要保留对计时器的引用,以便您可以在适当时向其发送无效消息.如果您创建一个未安排的计时器(请参阅"未计划的计时器"),那么您必须保持对计时器的强引用(在引用计数环境中,您保留它),以便在使用它之前不会取消分配.

这是什么意思?

如果你allocinit计时器,你也必须release这样,如下:

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

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

...
...

[timer invalidate];
timer = nil;
Run Code Online (Sandbox Code Playgroud)

一旦将计时器添加到运行循环中,就没有理由继续对它进行引用,因为运行循环拥有它.在这种情况下,如图所示,只要将release计时器添加到运行循环中,就会立即执行计时器,然后invalidate在完成时将其添加到计时器中.最后一行(设置计时器nil)是为了安全.调用invalidate将导致计时器被释放(通过运行循环),因此保持指向它的引用是不安全的.设置本地引用以nil保持事物犹太洁净.

但是,如果您使用以下方便方法之一创建计时器:

NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval ...];
Run Code Online (Sandbox Code Playgroud)

不会需要调用[timer release]的一切!方便方法将计时器添加到运行循环,然后运行循环拥有它,因此您不需要对返回的计时器对象执行任何内存管理.invalidate当您不再想要使用它时,您只需要计时器:

[timer invalidate];
timer = nil;
Run Code Online (Sandbox Code Playgroud)

或者,如果计时器未设置为重复,则根本不执行任何操作,因为它将在第一次调用后释放.

  • 一旦你调用[计时器释放],假设计时器仍然有效是不好的形式.在单个方法的情况下,您几乎总是安全的,但如果[计时器释放]放在[计时器无效]之后,代码将更好. (2认同)

小智 8

这两种方法做了不同的事情.如果您拥有一个计时器(您保留它,或分配它,或复制它),那么您应该释放它.如果您在运行循环上安排它,那么您必须使其无效,以便运行循环释放它.如果你做了两件事,那么你必须释放并使计时器无效(但是通常让运行循环拥有计时器就足够了).