слабые и сильные в Objective-C - PullRequest
0 голосов
/ 01 октября 2018

В случае, когда внутри блока есть много ссылок на weakSelf, рекомендуется создать его сильную версию.Код выглядит так:

__weak typeof(self) weakSelf = self;
self.theBlock = ^{
    __strong typeof(self) strongSelf = weakSelf;

    [strongSelf doSomething];
    [strongSelf doSomethingElse];
};

Что меня беспокоит, так это строка в приведенном выше коде:

__strong typeof(self) strongSelf = weakSelf;

Разве это не ошибочно, когда мы пишем typeof(self)?Разрешено ли здесь ссылаться на self?

В уроках иногда пишут:

__strong typeof(weakSelf) strongSelf = weakSelf;

Обе версии используются 50/50.Оба они верны?

1 Ответ

0 голосов
/ 01 октября 2018

Разве это не ошибочно, когда мы пишем 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

...