NSTimer内存管理问题

时间:2011-01-28 06:46:12

标签: objective-c memory-management nstimer nsthread

默认情况下,按方法alloccopy返回的对象的retain count等于1,因此您必须自行释放。

但是通过NSTimer样本代码

// in one method start the timer (which myTimer is an Class Instance)
myTimer = [NSTimer scheduledTimerWithTimeInterval:1
                   target:self selector:@selector(method:)
                   userInfo:nil repeats:YES];

// in another method 
[myTimer invalidate];
myTimer = nil;

我的问题是为什么[NSTimer sche **]返回一个你不需要保留的对象,但你可以在任何地方访问它。你不需要发布它,只需要在它上面调用invalidate

1 个答案:

答案 0 :(得分:4)

实例保留在分配给它的运行循环中。 保留计数保持在零以上,直到运行循环释放它。 因此,您可以访问该对象,直到发生这种情况。

来自NSTimer docs

  

计时器与run一起工作   循环。要有效地使用计时器,你   应该知道如何运行循环   操作 - 参见NSRunLoop和线程   编程指南。请特别注意   运行循环保留其计时器,所以   你有可以释放计时器   将它添加到运行循环中。

然后具体说:

  

使用   scheduledTimerWithTimeInterval:调用:重复:   要么   scheduledTimerWithTimeInterval:目标:选择器:USERINFO:重复:   class方法来创建计时器和   在当前的运行循环中安排它   默认模式。

因此,您使用的方法可以自动处理当前的运行循环。