打破嵌套在另一个块中的块中的保留循环
break retain cycle in a block nested in another block
有时我使用嵌套在另一个块中的块,这是我的代码
- (void)test {
__weak typeof(self) weakSelf = self;
[self.viewSource fetchData:^(BOOL succeed, NSError * _Nonnull error, id _Nonnull data) {
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf.dataSource disposalData:^{
// here is the strongSelf ok? do I have to do something to avoid retain cycle?
[strongSelf updateUI];
}];
}];
}
- (void)updateUI {
}
我怀疑内部块是否还有保留周期?
[strongSelf.dataSource disposalData:^{
[strongSelf updateUI];
}];
我的问题是在这种情况下打破保留周期的正确方法是什么?
这里补充一下,很多朋友提到这个,如果我去掉__strong typeof(weakSelf) strongSelf = weakSelf;
,里面的block没有retain cycle?完全正确吗?
- (void)test {
__weak typeof(self) weakSelf = self;
[self.viewSource fetchData:^(BOOL succeed, NSError * _Nonnull error, id _Nonnull data) {
[weakSelf.dataSource disposalData:^{
[weakSelf updateUI];
}];
}];
}
- (void)updateUI {
}
我认为您可以在嵌套块中创建新的强引用,如下所示:
- (void)test {
__weak typeof(self) weakSelf = self;
[self.viewSource fetchData:^(BOOL succeed, NSError * _Nonnull error, id _Nonnull data) {
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf.dataSource disposalData:^{
__strong typeof(weakSelf) strongSelf = weakSelf; // <- new strong ref
[strongSelf updateUI];
}];
}];
}
它将覆盖嵌套块作用域中的第一个 strongSelf
。并且它只会在没有创建强引用循环的嵌套块执行期间存在。我也这么认为 =)
有时我使用嵌套在另一个块中的块,这是我的代码
- (void)test {
__weak typeof(self) weakSelf = self;
[self.viewSource fetchData:^(BOOL succeed, NSError * _Nonnull error, id _Nonnull data) {
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf.dataSource disposalData:^{
// here is the strongSelf ok? do I have to do something to avoid retain cycle?
[strongSelf updateUI];
}];
}];
}
- (void)updateUI {
}
我怀疑内部块是否还有保留周期?
[strongSelf.dataSource disposalData:^{
[strongSelf updateUI];
}];
我的问题是在这种情况下打破保留周期的正确方法是什么?
这里补充一下,很多朋友提到这个,如果我去掉__strong typeof(weakSelf) strongSelf = weakSelf;
,里面的block没有retain cycle?完全正确吗?
- (void)test {
__weak typeof(self) weakSelf = self;
[self.viewSource fetchData:^(BOOL succeed, NSError * _Nonnull error, id _Nonnull data) {
[weakSelf.dataSource disposalData:^{
[weakSelf updateUI];
}];
}];
}
- (void)updateUI {
}
我认为您可以在嵌套块中创建新的强引用,如下所示:
- (void)test {
__weak typeof(self) weakSelf = self;
[self.viewSource fetchData:^(BOOL succeed, NSError * _Nonnull error, id _Nonnull data) {
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf.dataSource disposalData:^{
__strong typeof(weakSelf) strongSelf = weakSelf; // <- new strong ref
[strongSelf updateUI];
}];
}];
}
它将覆盖嵌套块作用域中的第一个 strongSelf
。并且它只会在没有创建强引用循环的嵌套块执行期间存在。我也这么认为 =)