2

我想我了解如何创建简单的保留周期,但我不完全了解更复杂的情况。

这是会导致保留周期的代码。(正确的?)

[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在 completionBlock 中捕获自身relayoutWithCompletion:?我是否正确地认为因为 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];

            }];
        }

    }];
}];

一路下来还好...

4

1 回答 1

2

不,您的 weakSelf 是一个弱参考。弱引用不会导致保留循环。这就是使用弱的原因。

于 2014-04-25T20:40:34.150 回答