繁体   English   中英

块中的@synchronized(self)是否会导致保留周期?

[英]Does @synchronized(self) in a block lead to a retain cycle?

假设我想在一个块内执行@synchronized(self) 我想这将导致一个保留周期,因此通常我们将这样重写它:

-(void)myMethod
{
    __weak TheClass * weakSelf = self;
    dispatch_async(dispatch_get_main_queue(),
    ^{
        TheClass * strongSelf = weakSelf;
        if(strongSelf == nil)
        {
            return;
        }

        @synchronized(strongSelf)
        {
            //mutex code
        }
    }
}

我的问题是,当您以这种方式使用@synchronized指令时,它是否等同于@synchronized(self)

简短答案:否

更长的答案:

背景

为了有一个涉及一个块的循环 ,该块必须引用另一个对象,并且该对象必须(直接或通过更长的链)引用该块。

循环本身并不坏,仅当它导致循环中的对象寿命延长到需要这些对象的时间点时,这才是不好的。 只要在某个时候断开循环(通过断开形成循环的链接之一),就可以创建一个循环。

像这样的构造:

__weak TheClass * weakSelf = self;
...
self.blockVar = ^{
    TheClass * strongSelf = weakSelf;
    ...

防止由于以下原因而创建静态循环: self引用(被引用的对象-被您引用的对象-您知道,变量并不重要,但被其引用的对象) blockVarblockVar仅具有弱引用self

但是,每次执行该块时,它都会创建一个对self的强引用(存储在strongSelf ),因此会创建一个动态循环-当该块完成执行时,该循环会自动中断。

您的密码

  1. 查看您的代码,创建一个块并将其直接传递给dispatch_async您永远不会在self存储对该块的引用。 因此,这里从来没有任何循环,根本不需要弄乱弱引用。

  2. 一旦该块创建了strongSelf就存在一个循环,然后使用@synchronized(strongSelf)不会创建第二个循环,它只是对对象进行了锁定。 当同步语句退出时,锁消失,当块退出时,强循环消失。

高温超导

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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