gpt4 book ai didi

iphone - NSTimer,保留还是不保留

转载 作者:行者123 更新时间:2023-12-03 19:10:47 28 4
gpt4 key购买 nike

这是让我困惑了一段时间的事情。

我有一个 NSTimer,添加到 currentRunLoop 中,如果我不保留它,它就会崩溃。

NSTimer *timer = [[NSTimer timerWithTimeInterval:60.0 target:self selector:@selector(tryUnion:) userInfo:nil repeats:NO] retain];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

我读到我不需要保留它,因为 NSRunLoop 的 addTimer 可以做到这一点。

后来我失效并释放(如果我上面不保留,下面我就不释放 - 这就是崩溃的情况):

- (void) tryUnion:(NSTimer*)aTimer {
[aTimer invalidate];
[aTimer release];
}

我的问题是1)如果可以在没有保留/释放的情况下完成我所做的事情,我应该如何写这个。2) 分析在“计时器”中标记此对象或对象的潜在泄漏。如这里所写,是否存在泄漏的可能性,或者只是分析器不够聪明,无法知道计时器调用的函数中有释放?

最佳答案

规则是,如果你没有保留它,就不要释放它。 Here is a similar question which talks about that.因此,在您的示例代码中,我建议不要保留它,也不要释放它。

但这不是你的问题。您的问题是您创建了一个非重复计时器。您不需要使它们无效,它们在触发后会自行无效。来自 NSTimer docs :

repeats
If YES, the timer will repeatedly reschedule itself until invalidated. If NO, the timer will be invalidated after it fires.

因此,您既不应该保留/释放该计时器,也不应该使其无效。火并忘记。

顺便说一句,如果您使用 scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:,也可以将计时器添加到运行循环中。所以你的整个事情会是这样的:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60.0 target:self selector:@selector(tryUnion:) userInfo:nil repeats:NO];

你的定时器函数不需要对aTimer做任何事情,只需做你的定时器应该做的任何事情;计时器将失效并释放,无需进一步干预。

关于iphone - NSTimer,保留还是不保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6038698/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com