繁体   English   中英

iOS-GCD对自我的弱引用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM