[英]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
引用(被引用的对象-被您引用的对象-您知道,变量并不重要,但被其引用的对象) blockVar
但blockVar
仅具有弱引用self
。
但是,每次执行该块时,它都会创建一个对self
的强引用(存储在strongSelf
),因此会创建一个动态循环-当该块完成执行时,该循环会自动中断。
您的密码
查看您的代码,创建一个块并将其直接传递给dispatch_async
您永远不会在self
存储对该块的引用。 因此,这里从来没有任何循环,根本不需要弄乱弱引用。
一旦该块创建了strongSelf
就存在一个循环,然后使用@synchronized(strongSelf)
不会创建第二个循环,它只是对对象进行了锁定。 当同步语句退出时,锁消失,当块退出时,强循环消失。
高温超导
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.