NSTimer内存管理问题

发布于 2024-10-14 20:47:16 字数 530 浏览 8 评论 0原文

默认情况下,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 即可。

By default an object returnd by method alloc or copy has retain count equals to 1, so you have to release it by yourself.

But through NSTimer sample codes

// 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;

My question is why [NSTimer sche**] returns an object that you needn't retain, but you can access it anywhere. And you needn't release it but only invoke invalidate on it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泪冰清 2024-10-21 20:47:16

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

来自 NSTimer 文档:

定时器与运行结合使用
循环。要有效地使用计时器,您
应该知道如何运行循环
操作——参见 NSRunLoop 和 Threading
编程指南。特别注意
运行循环保留它们的计时器,所以
您可以在完成后释放计时器
将其添加到运行循环中。

然后具体来说:

使用
ScheduledTimerWithTimeInterval:调用:重复:
或者
ScheduledTimerWithTimeInterval:目标:选择器:用户信息:重复:
类方法来创建计时器和
将其安排在当前运行循环中
默认模式。

因此,您使用的方法会自动适用于当前的运行循环。

The instance is retained in the run loop that it is assigned to.
The retain count remains above zero until the run loop releases it.
So you can access the object until that happens.

From the NSTimer docs:

Timers work in conjunction with run
loops. To use a timer effectively, you
should be aware of how run loops
operate—see NSRunLoop and Threading
Programming Guide. Note in particular
that run loops retain their timers, so
you can release a timer after you have
added it to a run loop.

And then specifically:

Use the
scheduledTimerWithTimeInterval:invocation:repeats:
or
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
class method to create the timer and
schedule it on the current run loop in
the default mode.

So the method you've used works with the current run loop automatically.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文