Я знаю, как решить эту проблему для свойств, но как насчет CGFloat
ivars
Как вы знаете, решение для свойств: weakSelf
pattern:
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
CGFloat localVar = weakSelf.property;
...
});
Решение для ivars очень похоже, за исключением того, что вам нужно явно проверить, является ли weakSelf
nil
или нет, потому что вы не можете разыменовать ivar из указателя nil
. Таким образом, вы создаете сильную локальную ссылку на ваш weakSelf
, а затем проверяете, не является ли он nil
:
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
typeof(self) strongSelf = weakSelf;
if (strongSelf) {
CGFloat localVar = strongSelf->ivar;
}
});
Очевидно, в вашем примере мы, как правило, не будем беспокоиться о сильных ссылочных циклах (поскольку цикл разрешается, как только заканчивается блок), а просто используем синтаксис self->minimumForegroundWidth
, чтобы отключить предупреждение. Но вышеприведенные шаблоны weakSelf
важны там, где возможны сильные опорные циклы (например, вы сохраняете блок в свойстве, используете его для повторения таймера и т. Д.).