将在weakSelf调用的方法中引用weakSelf会导致保留周期吗?

时间:2014-04-25 20:10:48

标签: ios objective-c objective-c-blocks weak-references retain-cycle

我想我理解保留周期是多么简单,但我不能完全理解更复杂的情况。

这是导致保留周期的代码。 (右?)

[self.dataController loadInitialWithCompletion:^(BOOL dataChanged) {
    self.loading = NO;
}];

为避免保留周期,我会创建一个对self的弱引用:

__weak typeof(self) welf = self;
[self.dataController loadInitialWithCompletion:^(BOOL dataChanged) {
    welf.loading = NO;
}];

我希望到目前为止我是正确的。

这里有趣的地方。我有一个计算和缓存文本高度的方法,然后在tableView上调用reloadData。该方法异步执行,并在完成后调用它的completionBlock(在mainThread上)。

 __weak typeof(self) welf = self;
[self.dataController loadInitialWithCompletion:^(BOOL dataChanged) {
    [welf relayoutWithCompletion:^(CGPoint offsetBeforeReload) {
        welf.loading = NO;

        if (dataChanged) {
            [welf save];
        }

    }];
}];

此代码会导致保留周期,因为welf会在relayoutWithCompletion:的completionBlock中捕获自身吗?我是否正确认为因为welf是一个弱参考,我会避免保留周期?

如果我更进一步怎么办?

 __weak typeof(self) welf = self;
[self.dataController loadInitialWithCompletion:^(BOOL dataChanged) {
    [welf relayoutWithCompletion:^(CGPoint offsetBeforeReload) {

        if (offsetBeforeReload.y > 64) {
            [welf scrollToPoint:offsetBeforeReload completion:^{
                welf.loading = NO;
                [welf save];

            }];
        }

    }];
}];

它一直欢迎......

1 个答案:

答案 0 :(得分:2)

没有。你的弱自己是一个弱参考。弱引用不会导致保留周期。这就是使用弱的原因。