我正在使用dispatch_async方法在主隊列中執行任務。但它造成保留週期:dispatch_async嵌套塊
以下是代碼片段:
self.test = ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", self);
});
};
我不能得到妥善爲什麼它正在創建擋週期。由於我的控制器沒有dispatch_async塊的所有權。
我正在使用dispatch_async方法在主隊列中執行任務。但它造成保留週期:dispatch_async嵌套塊
以下是代碼片段:
self.test = ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", self);
});
};
我不能得到妥善爲什麼它正在創建擋週期。由於我的控制器沒有dispatch_async塊的所有權。
嘗試使用weakSelf
:
__weak typeof(self) weakSelf = self;
self.test = ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", weakSelf);
});
};
中,但是然後'self'可以在外塊的運行之間解除分配和內部塊的(異步)運行,這可能不是他想要的 – newacct
如果你不希望外部塊保留self
,但希望內部塊中能夠保持self
活着一旦出動,也許是這樣的:
typeof(self) __weak weakSelf = self;
self.test = ^{
typeof(self) strongSelf = weakSelf;
if (strongSelf) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", strongSelf);
});
}
};
屬性'test'保留閉包並且閉包包含對'self'的引用無關緊要,那個引用本身在塊 – Paulw11