看源码关于SCAnimationView.m中一个疑惑
pikeszfish opened this issue · 5 comments
pikeszfish commented
v2ex/v2ex-iOS/Additions/SCPullRefresh/SCAnimationView.m
- (void)animateLoop {
static NSInteger index = 0;
CALayer *layer = self.layerArray[index];
CAAnimationGroup *animationGroup = [self createAnimationGroup];
[animationGroup setValue:layer forKey:@"layer"];
[animationGroup setCompletion:^(BOOL finished, CALayer *endLayer) {
layer.opacity = 0.0;
layer.position = kLayerPosition;
}];
......
这里面的block为什么引用了一个局部变量...? 而不是 endLayer ?
初学iOS,不太理解这里的行为... 也不知道这里的retain release是在哪里做的?
singro commented
ARC 不需要写 retain/release;
block 里用局部变量和 endLayer 是一样的,不过感觉上直接用外面的 layer 更好理解吧, 就是动画完成后重置到初始状态。
pikeszfish commented
是的,不需要retain/release;
我想表述是 不理解的这个局部变量他的引用计数什么时候为0
因为我看着觉得 layer这个局部变量在- (void)animateLoop { ...... } 结束之后就 -1 了 但还被block持有,那是要等到这个complete这个block执行完才再次-1 得到0吗?
singro commented
block 会持有这个 layer, 在 completion block 销毁后再 -1, 并不是 block 执行完 -1。 block 可能永远不会被执行到, 但是如果 block 被释放,对应它持有的 layer 也会被释放
pikeszfish commented
但是看后面 block, 好像是想用的 endLayer 来做的 .
这里使用了 layer 后面获得的 endLayer 就没意义了.
singro commented
是的。。 这里用 endLayer 也可以。。