为什么要正确调用此完成块?
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;
),但循环引用的成分似乎并不存在,因为没有引用监视器。
这是正常行为吗?这是我可以依靠的行为吗?这对我来说真的没有意义。
答案 0 :(得分:2)
据推测,Monitor
实例是此处的目标。 NSTimer
保留其目标,以避免因解除分配的对象在其触发时发送消息而导致崩溃。*当前运行循环在计划时保留计时器。
这是正常行为,you can rely on it:
<强>靶强>
的强引用
发送消息的对象[...]计时器保留对target
...
事实上,您必须考虑到这一点,以免在计时器与其目标之间创建保留周期。
* NSTimer
早于自动修复弱引用。