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); 
     }); 
    } 
};