我公司可以派的说法与@selector中NSTimer?如果我想发布NSTimer,请执行以下步骤dealloc吗?
[timer invalidate];
[timer release];
Run Code Online (Sandbox Code Playgroud)
e.J*_*mes 15
[timer release]只有你"拥有"计时器才需要被调用.来自Apple的文档:
因为运行循环维护计时器,所以从内存管理的角度来看,一旦计划完毕,通常不需要保留对计时器的引用.由于在将方法指定为选择器时将计时器作为参数传递,因此可以在该方法中适当时使重复计时器无效.但是,在许多情况下,您还需要选择使计时器失效 - 甚至可能在启动之前.在这种情况下,您需要保留对计时器的引用,以便您可以在适当时向其发送无效消息.如果您创建一个未安排的计时器(请参阅"未计划的计时器"),那么您必须保持对计时器的强引用(在引用计数环境中,您保留它),以便在使用它之前不会取消分配.
这是什么意思?
如果你alloc和init计时器,你也必须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)
或者,如果计时器未设置为重复,则根本不执行任何操作,因为它将在第一次调用后释放.
小智 8
这两种方法做了不同的事情.如果您拥有一个计时器(您保留它,或分配它,或复制它),那么您应该释放它.如果您在运行循环上安排它,那么您必须使其无效,以便运行循环释放它.如果你做了两件事,那么你必须释放并使计时器无效(但是通常让运行循环拥有计时器就足够了).
| 归档时间: |
|
| 查看次数: |
6472 次 |
| 最近记录: |