为什么正确调用此完成块?

时间:2016-09-23 23:15:02

标签: objective-c closures automatic-ref-counting

为什么要正确调用此完成块?

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

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

监视器将在实例化监视器10秒后启动NSTimer以调用完成块。

监视器确实在内部引用了comp(通过@property (nonatomic) CompletionBlock compblock;),但循环引用的成分似乎并不存在,因为没有引用监视器。

这是正常行为吗?这是我可以依靠的行为吗?这对我来说真的没有意义。

1 个答案:

答案 0 :(得分:2)

据推测,Monitor实例是此处的目标。 NSTimer保留其目标,以避免因解除分配的对象在其触发时发送消息而导致崩溃。*当前运行循环在计划时保留计时器。

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

  

<强>靶
  发送消息的对象[...]计时器保留对target ...

的强引用

事实上,您必须考虑到这一点,以免在计时器与其目标之间创建保留周期。

* NSTimer早于自动修复弱引用。