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

Что точно означает "__weak typeof (self) weakSelf = self"; имею в виду

Это используется в слабом шаблоне Objective-C

Я предполагаю, что это означает: назначить слабую ссылку на себя с именем "weakSelf" и тип self (например, MyViewController)

Если это правильно и выглядит для вас очевидным: я хочу быть абсолютно уверенным, чтобы все было правильно. Спасибо.

4b9b3361

Ответ 1

Я предполагаю, что это означает: назначить слабую ссылку на себя с именем weakSelf и typeof self (например, MyViewController)

Да, это почти что значит. Тип self будет MyViewController* (со звездочкой) не MyViewController.

Идея использования этого синтаксиса вместо простого написания

MyViewController __weak *weakSelf = self;

упрощает реорганизацию кода. Использование typeof также позволяет определить фрагмент кода, который можно вставить в любом месте вашего кода.

Ответ 2

Ваша интерпретация верна. Тем не менее, я нахожу, что, когда это написано именно так, это немного запутанно читать. Я предпочитаю его с дополнительным пространством после typeof(self):

__weak typeof(self) weakSelf = self;

Ответ 3

Использование @weakify и @strongify из libExtObjC помогает упростить "слабый сильный танец", иногда приходится делать блоки. OP ссылается на эту статью .

Пример

__weak __typeof(self) weakSelf = self;
__weak __typeof(delegate) weakDelegate = delegate;
__weak __typeof(field) weakField = field;
__weak __typeof(viewController) weakViewController = viewController;
[viewController respondToSelector:@selector(buttonPressed:) usingBlock:^(id receiver){
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    __strong __typeof(weakDelegate) strongDelegate = weakDelegate;
    __strong __typeof(weakField) strongField = weakField;
    __strong __typeof(weakViewController) strongViewController = weakViewController;

по сравнению с...

@weakify(self, delegate, field, viewController);
[viewController respondToSelector:@selector(buttonPressed:) usingBlock:^(id receiver){
    @strongify(self, delegate, field, viewController);

Ответ 4

В зависимости от настроек вашего компилятора вы можете получить предупреждение "Ожидаемое"; после выражения ". Вы можете исправить это, изменив его, чтобы использовать __typeof следующим образом: __typeof(self) __weak weakSelf = self;

Благодаря Лео Натан и этот вопрос: fooobar.com/info/277179/....