Назначение переменной внутри блока требует слабой ссылки?

Итак, у меня есть следующий код:

[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.

Другие вопросы по тегам