在以下代码段中,有三种类型的块。我的问题是哪个对象引用了每个块? (启用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();
}
答案 0 :(得分:2)
对于animateWithDuration:delay:options:animations:completion:
,它会立即运行animations
块。方法返回后,没有对象存储对块的强引用。它将completion
块存储在未指定的位置。也许它被当前CATransaction
保留。
在dispatch_async
的情况下,队列保留块。
在myMethod:
的情况下,没有对象存储对块的强(保留)引用。在调用期间,对块的强引用存储在堆栈中。