我们应该在什么时候将weakSelf更改为strongSelf?

11 浏览
0 Comments

我们应该在什么时候将weakSelf更改为strongSelf?

我知道当我们使用block时,应该使用weakSelf来避免循环引用。但有时候在block中会看到strongSelf。

让我困惑的是:

  1. 为什么一定要将weakSelf改为strongSelf?
  2. 如果我们不将weakSelf改为strongSelf会发生什么可怕的事情?
  3. 什么时候应该将weakSelf改为strongSelf?

希望有人能给出一个确切的例子。

提前感谢。

0
0 Comments

当我们需要在回调返回后使用"self"时,我们需要将weak self转换为strong self。这样做的原因是,如果我们只使用weak self,当回调返回后,weak self可能会变为nil,这样在使用它时会导致崩溃或其他不可预测的结果。因此,为了确保在回调返回后仍然能够安全地使用self,我们需要将weak self转换为strong self。

解决方法就是在使用weak self之前,先将其转换为strong self。这样做可以确保即使在回调返回后,我们仍然拥有一个有效的引用,可以安全地使用self。

下面是一个简单的示例代码,演示了为什么我们需要将weak self转换为strong self:

__weak typeof(self) weakSelf = self;
[self.bgQueue1 addOperationWithBlock:^{
    [weakSelf doSomeMagic:weakSelf.importentArr arg:number];
    if (weakSelf.importentArr.count == 10){
        //如果weakSelf变为nil,这里将会崩溃或产生其他不可预测的结果
        [DataBaseClass save:weakSelf.importentArr];
    }
}];

在上面的代码中,我们使用了一个异步操作来执行一些任务。在这个异步操作的回调中,我们使用了weakSelf来避免循环引用。然而,当我们尝试使用weakSelf.importentArr时,如果weakSelf变为nil,这段代码将会出现问题。为了解决这个问题,我们需要将weakSelf转换为strong self,以确保在使用weakSelf.importentArr时它不会为nil。

当我们需要在回调返回后使用"self"时,我们应该将weak self转换为strong self,以确保我们仍然拥有一个有效的引用来安全地使用self。

0
0 Comments

当我们在一个block中使用self的时候,需要将self以弱引用或强引用的方式捕获。当self以弱引用的方式被捕获后,我们需要根据它的使用情况来确定是否需要先进行强引用的复制。

如果block会多次使用被捕获的self引用,则应该始终进行强引用的复制。这样可以确保在block内部的所有使用中,引用都保持有效,并且避免了多次加载弱引用的开销。

例如,如果block的功能依赖于self是否仍然存在,那么通常会首先创建一个强引用并进行测试。代码如下:

__weak __typeof(self)weakSelf = self;
myBlock = ^{
    // 为self创建本地强引用
    __typeof(weakSelf) strongSelf = weakSelf; 
    // 检查self是否仍然存在,并相应地处理
    if (strongSelf)
    {
        // 如果"self"仍然存在,则执行所需操作
        // strongSelf将在调用期间保持对象有效
    }
    else
    {
        // 如果"self"不再存在,则执行所需操作(如果有)
    }
};

然而,如果block的操作只在需要使用self引用的对象时才进行,则可能永远不会创建强引用的复制。

以上是关于何时需要将weakSelf更改为strongSelf以及解决方法的内容。

希望对你有所帮助。

0
0 Comments

我们什么时候需要将weakSelf更改为strongSelf?

有时候,当引用self的对象已经是nil(用户关闭了视图)时,你希望block不执行。这就是为什么你首先使用weak引用的原因。(常见情况)

然而,有时候,当block开始执行后,你希望block能够确保它所引用的所有东西都是有效的,但前提是"self"仍然存活。在这种情况下,你需要将weak引用转换为strong引用。(罕见情况)

如果我们不将weakSelf更改为strongSelf会发生什么可怕的事情?

如果block在self仍然存活的情况下开始执行(允许它开始执行),但在处理过程中被释放(比如耗时的函数,如图像处理),然后block访问self的资源(该资源已经不存在),它将会导致崩溃。

我们什么时候需要将weakSelf更改为strongSelf?

几乎从不需要。我唯一能想到的例子是当你的block在开始执行后绝对需要来自"self"的资源。

关于这个问题,这个答案中有更详细的解释:

Strong reference in the block, it will be retained?

我可以说将weakSelf更改为strongSelf比仅使用weakSelf更安全吗?

是的,只要你在block的开始处检查'self'是否存在。但这在实际情况中非常罕见,一旦进入block,self就会消失。(阅读链接的问题)

"然后block访问self的资源(该资源已经不存在)将导致崩溃。" 这取决于你所说的“访问self的资源”的具体含义。在这种情况下,它将从weakSelf(而不是self)访问它,当指向的对象被释放时,weakSelf将为nil。在一个nil指针上调用一个方法或访问一个属性(这也是调用一个方法)将不会导致崩溃。只有在weakSelf上直接访问实例变量时,如果它为nil,才会导致崩溃。

这是Objective-C,所以是的,向nil发送消息不会导致崩溃,但在许多方法中,添加一个nil会导致崩溃。想想NSArray在添加一个"nil"对象时会发生崩溃的情况。

0