每当我想制作计时器时,我都会这样做:
[NSTimer scheduledTimerWithTimeInterval:5.0
target:self
selector:@selector(someMethod)
userInfo:nil
repeats:NO];
而不是
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0
target:self
selector:@selector(someMethod)
userInfo:nil
repeats:NO];
第一个是内存泄漏吗?正确的使用方法是什么?
最佳答案
这两个片段中都没有内存问题;您只需选择与计时器交互的需求即可。
当您安排计时器时,运行循环会保留它,并且在计时器触发时传递对计时器及其选择器的引用 - 例如,(void) doTimerThing: (NSTimer *)tim
1 -- 已使用,因此您严格没有必要将其放入变量中并自己保留它。 Apple 在 "Memory Management" section 中对此进行了非常清楚的解释。定时器编程主题文档。
但是,如果您可能希望在计时器触发之前(或在重复计时器触发之间)使计时器无效,则您确实需要对其进行引用。在这种情况下,对其调用 retain
也是一个好主意。 scheduledTimerWithTimeInterval:target:...
方法返回一个不属于您的对象,并且您不应该假设不属于您的对象的内存状态(包括它们是否处于自动释放状态)是否有池,或者运行循环将保持计时器多长时间)。如果您需要计时器(或任何对象)保留下来,您应该通过调用 retain
来声明其所有权。
1 请注意,计时器的方法应该始终 have one parameter ;代码片段中的选择器看起来像是用于不支持的方法。计时器似乎是这样工作的,但您的操作与记录的界面相反。
关于objective-c - NSTimer的内存管理——是否需要分配给变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7628076/