#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).