5

Я слышал, что я должен всегда использовать weakSelf в блоках, чтобы избежать удержания циклов, но как насчет блоков отправки? В этом случае, мой метод обрабатывает ошибочный ответ от моего сервера в следующем коде:Должен ли я использовать «weakSelf» в диспетчерском блоке?

//handling server errors (particularly "Token Refresh Failed" ones) 
-(void)handleServerErrorResponse:(NSString *)error { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIAlertController *alertController = [DialogHelper getAlertForSimpleAuthError:error]; 
     if ([error isEqualToString:@"Your login session has expired"]) { 
      [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) 
      { 
       [MyModelDataCenter emptyDataCenter]; 
       [MyAPIInterface sharedInstance].authToken = nil; 
       NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
       [defaults removeObjectForKey:@"authToken"]; 
       [defaults removeObjectForKey:@"defaultUserObjectDictionary"]; 
       [defaults synchronize]; 
       [AuthenticationHelper sharedInstance].loggedInUser = nil; 
       [self.navigationController popToRootViewControllerAnimated:YES]; 
      }]]; 
     } 
     else { 
      [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:nil]]; 
     } 
     [self presentViewController:alertController animated:YES completion:nil]; 
    }); 
} 

Должен ли я использовать weakSelf в этом блоке так же, как я делаю это в других блоках?

ответ

8

Вам необходимо использовать слабый сильный «танец», чтобы избежать цикла удержания , когда существует постоянный цикл сохранения. Для того чтобы это произошло, два условия должны быть выполнены:

  • блок принадлежит объект, на который ссылается внутри блока
  • владелец не освобождает блок перед его собственной открепления

Если одна из этих вещей неверна, то нет постоянного цикла сохранения, и нет проблем.

В этом случае не является ни. В общем, Блоки, помещенные в очереди отправки, не будут подвергаться сохранению циклов, если только вы не держите блок вокруг в ivar для повторного использования.

+0

Не могли бы вы привести пример того, когда он будет сохранен? – sbarow

+1

Вот пример, хотя и с несколькими промежуточными шагами: http://stackoverflow.com/q/11822476/603977 –

+0

Спасибо за объяснение, что так хорошо! И спасибо за пример! :) – Rafi

5

Даже я согласен с Джошем и договорились с самого начала, что нет никаких оснований для weakifying self, если не нужно (блок не выполняется с помощью ссылочного объекта), в прошлом большинство слабый self по умолчанию. (Я думаю, что изменения большинства.)

Тем не менее, может быть причина не weakify self даже там не сохраняет цикл:

изображения, что у вас есть объект экземпляра, который заполняется на продолжительном блок , Возможно, объект экземпляра будет умирать во время работы блока, т.е. е. потому что пользователь удалил его. В таком случае блок будет заполнять объект-экземпляр, который больше не используется, и ушел из вашей модели, но все еще жив, потому что блок удерживает его. Ослабив его, он освободит его и установит захваченный self на nil, что легко проверить и обычно просто ничего не делает.

Но я действительно не думаю и никогда не думал, что этот сценарий оправдывает эмпирическое правило «Ослабление по умолчанию».

+0

Вы говорите, что если мой вызов API занимает много времени из-за медленного подключения к Интернету, чтобы получить ответ от сервера, и если я появлю 'UIViewController', который имеет этот метод обработки ошибок, мое приложение будет аварийно завершено? – Rafi

+1

Нет, я этого не говорил. Что происходит, зависит от вашего конкретного кода. Я говорю: если у вас есть сильная ссылка на объект, он не будет освобожден, даже никто не ссылается на него. Что это делает с вашим приложением - я не знаю. –

+0

Хорошо, спасибо за информацию. Я остерегаюсь этих вещей :) – Rafi

Смежные вопросы