Блокировать сохранение себя для CGFloat ivars? - PullRequest
0 голосов
/ 05 января 2019

У меня есть класс с иваром, как этот:

@interface MCProgressBarView() {
  CGFloat minimumForegroundWidth;
  CGFloat availableWidth;
}

позже в коде, у меня есть это:

dispatch_async(dispatch_get_main_queue(), ^{

    CGRect frame = _foregroundImageView.frame;
    frame.size.width = roundf(minimumForegroundWidth + availableWidth * valor);
    _foregroundImageView.frame = frame;

    [self layoutIfNeeded];

});

Строка minimumForegroundWidth этого более позднего кода показывает эту ошибку:

Блок неявно сохраняет «я»; явно указать «я», чтобы указать это предполагаемое поведение

Я знаю, как решить эту проблему для свойств, но как насчет CGFloat ivars?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Я знаю, как решить эту проблему для свойств, но как насчет 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 важны там, где возможны сильные опорные циклы (например, вы сохраняете блок в свойстве, используете его для повторения таймера и т. Д.).

0 голосов
/ 05 января 2019

Синтаксис self->minimumForegroundWidth. Стрелка, а не точка. Мы возвращаемся к тому факту, что self на самом деле является указателем на struct, а -> - это нотация C для ссылки на члены этого элемента.

...