Что точно означает "__weak typeof (self) weakSelf = self"; имею в виду
Это используется в слабом шаблоне Objective-C
Я предполагаю, что это означает: назначить слабую ссылку на себя с именем "weakSelf" и тип self (например, MyViewController)
Если это правильно и выглядит для вас очевидным: я хочу быть абсолютно уверенным, чтобы все было правильно. Спасибо.
Ответы
Ответ 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/....