Блок не захватил себя в typeof, почему? - PullRequest
4 голосов
/ 07 марта 2019

Для этого:

self.block = ^{
    self.view.backgroundColor = [UIColor greenColor];
};

Очевидно, что есть цикл сохранения.

Однако цикл сохранения отсутствует, если self находится в typeof:

__weak typeof(self) weakSelf = self;
self.block = ^{
    __strong typeof(self) strongSelf = weakSelf;
    strongSelf.view.backgroundColor = [UIColor greenColor];
};

Собственная личность dealloc вызывается, хотя self находится в блоке. Это означает, что блок не захватил self здесь.

Почему?

1 Ответ

6 голосов
/ 07 марта 2019

typeof это не функция, это ключевое слово и вообще не используется во время выполнения. Все, что __strong typeof(self) делает здесь, говорит компилятору, как вычислять символ strongSelf. Это не вызывает генерации кода времени выполнения, потому что во время выполнения не имеет значения, что это за тип на самом деле. Все эти решения принимаются во время компиляции.

Это то же самое, что и определение чего-либо, как int x; Среда выполнения никоим образом не имеет ссылки на "int". Это просто тип C.

typeof технически является расширением C, но Clang поддерживает его в качестве ключевого слова в режиме совместимости gcc, который используется по умолчанию. Подробнее о расширении см. Документацию GCC .

...