Подтвердить что ты не робот

Ссылаясь на слабый "я" внутри вложенного блока

Предположим, я уже создал слабую личность, используя

__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
        ...
}];

Внутри этого блока, если я вложу другой блок:

[weakSelf doAnotherBlockOperation:^{
    [weakSelf doSomething];
}

это создаст цикл сохранения? Нужно ли мне создавать еще одну слабую ссылку на слабого себя?

__weak typeof(self) weakerSelf = weakSelf;
[weakSelf doAnotherBlockOperation:^{
    [weakerSelf doSomething];
}
4b9b3361

Ответ 1

Это зависит.

Вы создаете цикл сохранения только в том случае, если вы фактически храните блок (потому что self указывает на блок и блокирует точки до self). Если вы не собираетесь хранить ни один из блоков, использование сильной ссылки на self достаточно хорошо --- блок будет выпущен первым после того, как он будет выполнен, а затем он выведет его указатель на self.

В вашем конкретном примере, если вы не выполняете больше операций, которые не отображаются, вам не нужно создавать никаких более слабыхWeakerEvenWeakerSelfs.

Ответ 2

Ваш код будет работать нормально: слабая ссылка не вызовет цикл сохранения, так как вы явно укажете ARC, чтобы не увеличивать keepCount вашего слабого объекта. Однако для лучшей практики вам следует создать сильную ссылку на свой объект, используя слабый. Это не приведет к созданию цикла сохранения, поскольку сильный указатель внутри блока будет существовать только до тех пор, пока блок не завершится (только область является самим блоком).

__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    if (strongSelf) {
        ...
    }
}];