NSTimer的内存管理 - 是否需要将其分配给变量?

Sno*_*man 1 cocoa memory-leaks objective-c nstimer foundation

每当我想制作一个计时器时,我就是:

[NSTimer scheduledTimerWithTimeInterval:5.0 
                                 target:self 
                               selector:@selector(someMethod) 
                               userInfo:nil 
                                repeats:NO];
Run Code Online (Sandbox Code Playgroud)

而不是

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 
                                                  target:self 
                                                selector:@selector(someMethod) 
                                                userInfo:nil 
                                                 repeats:NO];
Run Code Online (Sandbox Code Playgroud)

第一个是内存泄漏吗?使用它们的正确方法是什么?

Jos*_*ell 7

在任何一个片段中都没有内存问题; 您只需要选择与计时器交互的需求.

当您安排一个计时器,运行循环保留它,到计时器的引用它触发时一起传递及其选择-例如,(void) doTimerThing: (NSTimer *)tim1 -被使用,所以它不是严格必要的,你把它放到变量并自己保留.Apple 在Timer Programming Topics文档的"Memory Management"部分清楚地解释了这一点.

但是,如果您可能希望在计时器触发之前使其无效(或者在重复计时器的触发之间),则需要对其进行引用.在这种情况下,呼吁retain它也是一个好主意.该scheduledTimerWithTimeInterval:target:...方法返回一个您不拥有的对象,您不应该假设您不拥有的对象的内存状态(包括它们是否在自动释放池中,或者运行循环将保持多长时间)计时器周围).如果你需要定时器(或任何物体),你应该通过调用来声明它的所有权retain.


1请注意,计时器的方法应始终有一个参数 ; 您的代码段中的选择器看起来像是一个没有的方法.计时器似乎以这种方式工作,但是你的操作与文档化的界面相反.

  • 查看我包含的代码段并阅读链接的文档.计时器的方法需要能够采用一个参数,即"NSTimer"的实例. (2认同)