簡體   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