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