0

我正在使用dispatch_async方法在主隊列中執行任務。但它造成保留週期:dispatch_async嵌套塊

以下是代碼片段:

self.test = ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"%@", self); 
     }); 
    }; 

我不能得到妥善爲什麼它正在創建擋週期。由於我的控制器沒有dispatch_async塊的所有權。

+1

屬性'test'保留閉包並且閉包包含對'self'的引用無關緊要,那個引用本身在塊 – Paulw11

回答

1

嘗試使用weakSelf

__weak typeof(self) weakSelf = self; 

self.test = ^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"%@", weakSelf); 
    }); 
}; 
+0

中,但是然後'self'可以在外塊的運行之間解除分配和內部塊的(異步)運行,這可能不是他想要的 – newacct

0

如果你不希望外部塊保留self,但希望內部塊中能夠保持self活着一旦出動,也許是這樣的:

typeof(self) __weak weakSelf = self; 
self.test = ^{ 
    typeof(self) strongSelf = weakSelf; 
    if (strongSelf) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"%@", strongSelf); 
     }); 
    } 
};