谁保留了阻止?

时间:2016-01-13 05:10:53

标签: ios objective-c-blocks

在以下代码段中,有三种类型的块。我的问题是哪个对象引用了每个块? (启用ARC)

typedef void (^CompletedBlock)(void);

- (void)viewDidLoad {
    [super viewDidLoad];

    [UIView animateWithDuration:<#(NSTimeInterval)#>
                          delay:<#(NSTimeInterval)#>
                        options:<#(UIViewAnimationOptions)#>
                     animations:^{<#code#>}
                     completion:^(BOOL finished) {<#block 1#>}];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
^{<#block 2#>});

    [self myMethod:^{<#block 3#>}];

}

- (void)myMethod:(CompletedBlock)completed
{
    completed();
}

1 个答案:

答案 0 :(得分:2)

对于animateWithDuration:delay:options:animations:completion:,它会立即运行animations块。方法返回后,没有对象存储对块的强引用。它将completion块存储在未指定的位置。也许它被当前CATransaction保留。

dispatch_async的情况下,队列保留块。

myMethod:的情况下,没有对象存储对块的强(保留)引用。在调用期间,对块的强引用存储在堆栈中。