Xcode 似乎只是有时会发出警告“在此 block 中强烈捕获‘ self ’可能会导致保留周期”,如下面的代码片段所示。
第一个 block 实际上对于保留循环是安全的吗?如果是,为什么?或者它是否不安全并且 xcode 不正确地给出警告?
最佳答案
这两个 block 都会导致一个保留周期。只是第一个更难检测到它,所以编译器不会报告它。
在您的第一个 block 中,我假设 datePicker
是您的对象的属性。所以你的对象保留了日期选择器,它保留了保留你的对象的 block (通过捕获 self )。这是一个包含 3 个对象的循环,但仍然是一个循环。
在你的第二个 block 中,这要简单得多:你的对象保留 block , block 保留你的对象(通过捕获 self )。这是一个只有 2 个易于识别的对象的循环(因此警告)。
在这两种情况下,您都应该弱捕获 self 以避免保留周期。
__weak typeof(self) weakSelf = self;
[self methodThatRetainsABlock: ^{
typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf == nil) {
return;
}
// Don't ever use self here, as it will capture it strongly.
// Use only strongSelf
}];
关于ios - xcode 保留周期警告仅有时发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42736496/