Предупреждение UIViewController о получении информации в среде ARC

#objective-c #cocoa-touch #uikit #automatic-ref-counting

#objective-c #cocoa-touch #uikit #автоматический подсчет ссылок

Вопрос:

Я оцениваю переход на ARC (автоматический подсчет ссылок) и рефакторинг для применения к моему коду. Среди вещей, которые я должен выяснить, есть это:

что мне делать в didReceiveMemoryWarning, если ARC не разрешает явное освобождение объектов? В настоящее время я использую этот метод для освобождения объектов, принадлежащих моему контроллеру, и которые легко извлекаются с помощью ленивых геттеров:

 - (void)didReceiveMemoryWarning {
    [_foo release]; _foo = nil;
    [super didReceiveMemoryWarning];
}
  

и относительный ленивый геттер:

 - (Foo *)foo {
    if (_foo) {
        return _foo;
    }
    return (_foo = [[Foo alloc] init]);
}
  

Кажется невозможным реализовать такой «шаблон» в ARC … итак, что мне делать? Следует ли считать didReceiveMemoryWarning «устаревшим» / бесполезным в ARC?

Ответ №1:

ARC обрабатывает код сохранения и освобождения, поэтому достаточно установить _foo равным нулю, чтобы позволить сгенерированному ARC коду выполнить освобождение. Вы явно не освобождаете, вы просто управляете своим графом объектов, и сгенерированный ARC код выполнит освобождение, когда это необходимо.

Для получения дополнительной информации ознакомьтесь с документом Apple Transitioning To ARC Release Notes.

Ответ №2:

Вы можете сделать несколько вещей, но все они зависят от приложения. Такие вещи, как очистка массивов и словарей и установка ссылок на объекты равными нулю (способ удаления объектов ARC).