2016-09-23 65 views
1

为什么这个完成块被正确地调用?为什么正确调用完成块?

CompletionBlock comp = ^(BOOL enabled) { 
      //enabled is being correctly set 
      NSLog(@"result: %i", enabled); 
}; 

@autoreleasepool { 
    Monitor *monitor = [[Monitor alloc]initWithCompletionBlock:comp]; 
    monitor = nil; 
} 

监视器将开始的NSTimer调用完成块10秒显示器实例化后。

显示器在内部引用了补偿(通过@property (nonatomic) CompletionBlock compblock;),但循环引用的组成部分似乎并不存在,因为没有任何引用监视器。

这是正常的行为吗?这是我能指望的行为吗?这对我来说确实没有意义。

+0

没有看到Monitor类的实现,我们无法真正给你一个正确的答案。 – rmaddy

回答

2

推测Monitor实例是此处的目标。 NSTimer保留其目标,以避免由于发送消息而导致崩溃。*当前运行循环在计划时保留计时器。

这是正常行为,you can rely on it

目标
目的向其发送消息[...]计时器维持强引用target ...

实际上,您必须考虑它,以便您不会在计时器与其目标之间创建保留周期。


* NSTimer早在很长一段时间内自动注入弱引用。

+0

你是对的,Monitor对象是目标。我也在用重复:NO。该文件指出,一旦定时器启动,它将失效。我猜这意味着选择器完成后?否则,GC有可能会很快做到这一点。 – user3564870

+1

是的,定时器不会使其自身失效,直到告知它的目标执行选择器为止。 –

相关问题