目标-C.对象的值设置为 nil。但是基于 NSTimer 的方法仍在执行



我有一个简单的应用程序,其中类Person具有Dog类型的属性doggo

doggo具有值(从某个ViewController使用KVO调用(的那一刻起,对象doggo在递增其hungerLevel属性。

-(void)dogGetsHungry {
[NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
self.hungerLevel += 10;
NSLog(@"Hunger level grows");
}];
}

现在,一些ViewController正在观察doggo饥饿级别。当hungerLevel超过160时,doggo逃逸(self.person.doggo = nil;(。

但是NSTimer永远不会停止。它将永远执行。我认为这可能与保留周期有关,所以我将的属性doggo设置为弱,但我收到了这个警告

将保留的对象分配给弱属性;分配后将释放对象

我认为这是一个很好的用例,其中类型Dog的属性应该是弱的,以避免strong保留循环。如果有人能帮助我理解这一点,我将不胜感激。

非常感谢你的帮助。

旁注:我正在使用KVO,所以我可以更好地了解它。

但是NSTimer永远不会停止。我认为这可能与保留周期有关

运行循环将保留计划的计时器。参见NSTimer:

运行循环维护对其计时器的强引用,因此在将计时器添加到运行循环后,您不必维护自己对计时器的强参考。

一旦在运行循环中进行了调度,计时器就会以指定的间隔启动,直到其无效。非重复计时器在触发后立即失效。但是,对于重复计时器,您必须通过调用其invalidate方法来自行使计时器对象无效。

您确实需要对计时器的引用来调用invalidate,将从scheduledTimerWithTimeInterval返回的计时器存储在属性中。

最新更新