objective-c - NSTimer的内存管理——是否需要分配给变量?

标签 objective-c cocoa memory-leaks nstimer foundation

每当我想制作计时器时,我都会这样做:

[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 *)tim1 -- 已使用,因此您严格没有必要将其放入变量中并自己保留它。 Apple 在 "Memory Management" section 中对此进行了非常清楚的解释。定时器编程主题文档。

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

<小时/>

1 请注意,计时器的方法应该始终 have one parameter ;代码片段中的选择器看起来像是用于不支持的方法。计时器似乎是这样工作的,但您的操作与记录的界面相反。

关于objective-c - NSTimer的内存管理——是否需要分配给变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7628076/

相关文章:

iOS: AVQueuePlayer/AVPlayerItem 'An AVPlayerItem can occupy only one position in a player' s queue at a time.'

ios - -[NSDictionary dictionaryWithContentsOfFile] 在 iPad 上返回 nil;在模拟器中返回字典

objective-c - NSSlider NSSliderCell 裁剪自定义旋钮

c++ - 使用 Char* 查找内存泄漏的原因

c# - C# 托管的 Powershell 中的内存泄漏

Mac 上的 Silverlight - 如何调试内存泄漏?

ios - 我应该在主线程上启动和停止 UIActivityIndi​​cator 实例吗?

objective-c - 绑定(bind)和目标/操作?

objective-c - NSOutlineView显示三个层次

iphone - 使用父/子上下文时批量大小不起作用