Разве это не ошибочно, когда мы пишем typeof (self)?Разрешено ли ссылаться на себя здесь?
(A) Нет. (B) да
typeof
является расширением языка (Objective-) C, которое в объявлении (здесь выобъявление strongSelf
) обрабатывается компилятором как время компиляции - в результирующем скомпилированном коде typeof
не используется.Основное использование typeof
в макросах #define
, что позволяет расширить один макрос для работы с различными типами;снова такое расширение макроса происходит во время компиляции.
В вашем случае вы создаете блок в методе экземпляра, в абстрактном виде ваш код будет выглядеть примерно так:
@implementation SomeClass {
- (someReturnType) someInstanceMethod {
... ^{ typeof(self) strongSelf = weakself; ... } ...
} }
Здесь typeof(self)
фактически просто "стенография" для SomeClass
.Использование self
обрабатывается во время компиляции, и не фиксируется ссылка на объект времени выполнения, на который ссылается self
.
Обе версии используются 50/50.Верны ли оба?
Они идентичны по значению.Правила ARC гласят, что если квалификатор отсутствует, то предполагается __strong
, поэтому одна версия полагается на это, а другая делает классификатор явным.
HTH