我有一个简单的应用程序,其中类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
返回的计时器存储在属性中。