[英]iOS - GCD weak and strong reference to self
在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然后,我取消对自我的强烈引用,并执行相同的过程。 在块完成工作之前,不会释放GCDViewController。 但随后被释放。
测试3现在,如果我直接指代自我(没有__weak
或__strong
),我在测试2 __strong
具有确切的行为。
因此,如果我想确保在执行块时self不会为nil,那么对__weak
引用使用__strong
引用对self
何在? 我在这里想念什么吗? 是否有任何示例会改变测试2和3的结果?
在GCD中的某个块中时,我一直在使用__weak引用self。 每个人都建议。
不,我不知道有人建议这样做。 在存在保留周期的某些情况下,弱引用是有意义的。 但是,一个块应该捕获对任何对象的弱引用还是强引用(包括一个self
指向的对象),取决于所讨论代码的特定内存管理设计,并且
我知道在GCD中对自我(经过测试)的强烈引用不会产生保留周期。
在全局或主队列上将一个块传递给dispatch_async
永远不会产生保留周期。
现在,如果我直接指代自我(没有__weak或__strong),我将具有测试2的确切行为。
在这种情况下,您可能看不到任何区别。 但是它们通常具有不同的行为。 基本上,您的问题是,捕获对self
指向的对象的强引用或弱引用的块之间有什么区别?
不同之处在于,如果当前对象(由self
指向的对象)已经被持有该对象强引用的所有其他对象(可能是该块)释放了,并且该块随后异步执行。
nil
,并且该块将不对其执行任何操作(它要么检查strongSelf
并在看到它为nil
时返回,否则将向其发送消息到strongSelf
nil
,什么都不做)。 因此,一种情况下完成了工作,而另一种情况下则什么也没有做。
如果您当前的对象是某个UI元素(例如视图或视图控制器),则只要它在视图层次结构中,它就会被视图层次结构中的事物保留,因此您需要退出该视图/视图控制器,以便在没有其他东西对其有强烈引用的情况下。
就您而言,您在块内要做的只是[weakSelf.activityIndicator stopAnimating];
,即更改UI。 该命令是否运行无关紧要,因为请记住,包含该命令的视图已经停止显示。 没有人可以看到此活动指示器。 那么,如果不停止,有什么不同呢? 但这是特定于此情况的。 通常,您可以想象该块中的命令会更改某些全局状态,或者通过网络或某些内容发送某些内容,如果您不这样做,则两者之间会有很大差异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.