【发布时间】:2016-07-30 10:29:47
【问题描述】:
当我在GCD 中的一个块中时,我总是使用__weak 对self 的引用。每个人都建议这样做。我知道在 GCD 中对self(已测试)的强烈引用不会产生保留周期。
Apple 建议使用 __weak 对 self 的引用,然后使用 __strong 对 _week 引用的引用,以保证在执行块时 self 不会是 nil。
我有以下代码:
- (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 然后我取消注释对 self 的强引用并执行相同的过程。在块完成工作之前,不会释放 GCDViewController。但后来它被释放了。
测试 3
现在,如果我直接引用 self(没有 __weak 或 __strong),我与测试 2 的行为完全相同。
因此,如果我想确保在执行块时 self 不会为零,那么使用 __strong 引用 __weak 引用 self 有什么意义?我在这里想念什么吗?是否有任何示例会改变测试 2 和 3 的结果?
【问题讨论】:
-
您在块内创建一个强引用,以防止在块运行时自我被释放的任何情况。
-
是的,我知道。但是 __strong 到 self 与直接调用 self 有什么区别?如果我直接调用 self,我会像使用 __strong 一样增加我计数的保留。两种情况下的输出都是一样的
-
如果您直接在块中引用 self ,那么只要块存在,它就会阻止 self 被释放。在块外部创建弱自我,然后在其内部创建强自我,允许在块周围时释放自我,并且仅在块运行时阻止它。
-
差异在您的示例中无关紧要,因为您的块会立即执行。在某些情况下对块的引用被某些东西保留然后稍后执行,这将很重要
-
你的意思是一个简单的块,但不是在 GCD 中?例如,当一个块被分配到一个强属性中时?
标签: ios objective-c objective-c-blocks