singro / v2ex

An iOS client for v2ex.com
MIT License
1.97k stars 453 forks source link

看源码关于SCAnimationView.m中一个疑惑 #40

Closed pikeszfish closed 7 years ago

pikeszfish commented 8 years ago

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 8 years ago

ARC 不需要写 retain/release; block 里用局部变量和 endLayer 是一样的,不过感觉上直接用外面的 layer 更好理解吧, 就是动画完成后重置到初始状态。

pikeszfish commented 8 years ago

是的,不需要retain/release; 我想表述是 不理解的这个局部变量他的引用计数什么时候为0 因为我看着觉得 layer这个局部变量在- (void)animateLoop { ...... } 结束之后就 -1 了 但还被block持有,那是要等到这个complete这个block执行完才再次-1 得到0吗?

singro commented 8 years ago

block 会持有这个 layer, 在 completion block 销毁后再 -1, 并不是 block 执行完 -1。 block 可能永远不会被执行到, 但是如果 block 被释放,对应它持有的 layer 也会被释放

pikeszfish commented 8 years ago

但是看后面 block, 好像是想用的 endLayer 来做的 . 这里使用了 layer 后面获得的 endLayer 就没意义了.

singro commented 8 years ago

是的。。 这里用 endLayer 也可以。。