我总是在GCD
的块中使用__weak
对self
的引用。大家都推荐这个。我知道在GCD中强烈提及self
(测试)不能产生保留周期。 Apple建议使用自我引用__weak
引用,然后使用_week
引用_week
引用来保证self
在执行该块时不会是nil
。iOS - GCD对自己的弱和强参照
我有以下的代码:
- (IBAction)startGCD:(id)sender {
GCDVC* __weak weakSelf = self;
[self.activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ // 1
// VC2* __strong strongSelf = weakSelf;
[weakSelf.proArray addObject:@"2"];
[NSThread sleepForTimeInterval:10];
NSLog(@"%@",weakSelf.proArray);
dispatch_async(dispatch_get_main_queue(), ^{ // 2
[weakSelf.activityIndicator stopAnimating];
});
});
}
试验1 我按下按钮和指示器在打转。在GCD完成和GCDViewController被释放之前,我按下后退按钮。
测试2 然后,我取消了对自我的强烈提及,并执行相同的过程。在块完成工作之前,GCDViewController不会被释放。但随后发布。
测试3 现在,如果我直接引用自(不__weak
或__strong
)我有测试2
所以,如果我想,以确保自身不会是零的具体行为当该块被执行时,使用__strong
参考__weak
对self
的引用是什么意思?我在这里想念什么?是否会改变Test 2 & 3的结果?
在块内部创建一个强引用,以防止块在运行时自我释放的任何情况。 – dan
是的,我知道。但是__strong和自己直接打电话给自己的区别是什么?如果我直接打电话给自己,我会像__strong一样增加留数。并且输出在两种情况下都是相同的 – BlackM
如果您直接在块中引用self,那么只要block在周围,就可以防止自我被释放。在块外部创建弱自我,然后其内部强壮的自我允许自我被解除分配,而块在其周围并且仅在块正在运行时阻止它。 – dan