Назначение переменной внутри блока требует слабой ссылки?
Итак, у меня есть следующий код:
[serviceHandler getHomeConfigurationData:^(NSDictionary *data){
if (data) {
NSLog(@"The Data: %@", data);
homeConfigData = data;
}
} failure:^(NSError *error, BaseServiceHandler *context){
homeConfigData = Nil;
NSLog(@"Error: %@", error);
}];
здесь, homeConfigData
переменная экземпляра в моем ViewController Весь этот метод делается в фоновом потоке. Возможно, что ViewController освобождается после того, как блок завершения возвращается / запускается. Так что я волнуюсь, если у меня возникнет проблема, когда я сделаю линию homeConfigData = data;
Как бы я справился с этим?
2 ответа
Возможно, что ViewController освобождается после того, как блок завершения возвращается / запускается.
На самом деле, как написано сейчас, невозможно, чтобы ViewController был освобожден к моменту запуска блока, потому что оба этих блока сохраняют self
как self
используется в обоих блоках (потому что переменная экземпляра homeConfigData
используется, что неявно означает self->homeConfigData
).
Как это:
YourClass *__weak weakSelf = self;
[serviceHandler getHomeConfigurationData:^(NSDictionary *data){
if (data) {
NSLog(@"The Data: %@", data);
weakSelf.homeConfigData = data;
}
} failure:^(NSError *error, BaseServiceHandler *context){
weakSelf.homeConfigData = Nil;
NSLog(@"Error: %@", error);
}];
Если все сильные указатели на себя станут нулевыми, экземпляр будет освобожден, а все слабые указатели, т.е. weakSelf
, станет ноль. Отправка setHomeConfigData
селектор на ноль будет noop.