Вот, по сути, ваш код:
- Создание слабой переменной,
weakSelf
. - Передача блока в функцию, которая ссылается на эту слабую переменную.
Эта точка, self
, не сохраняется ни блоком, ни переменной weakSelf
.Затем, когда блок выполняется, weakSelf
помещается в переменную __strong
, таким образом, сохраняя любое значение, которое было в weakSelf
.К сожалению, если исходное значение weakSelf
, а именно self
уже было освобождено, weakSelf
будет уже nil
.
Компилятор может видеть, к каким внешним переменным обращается ваш блок, и затем добавляет любыенеобходимо сохранить, если эти переменные __strong
.Компилятору все равно, что вы присваиваете переменную __weak
внутренней переменной, которая оказывается __strong
.Это сохранение произойдет , когда блок выполняется , а не при его создании.
Используя self
непосредственно из блока, компилятор видит, что вы ссылаетесь на переменную, которая не __weak
, и, следовательно, автоматически сохраняет эту переменную для жизненного цикла блока.В таких случаях я не вижу причин, по которым вы бы не ссылались непосредственно на себя в блоке, если вы не беспокоитесь о циклическом цикле сохранения.