locationManager
- это свойство, которое, вероятно, установлено с атрибутом retain
.
В основном, если вы только напишите:
self.locationManager = [[CLLocationManager alloc] init];
установщик левой стороны self.locationManager
сохраняет ссылку на выделенную CLLocationManager
. Но правая ссылка CLLocationManager
сама по себе никогда не выпускается. Число сохранений для этого менеджера никогда не достигает нуля, и объект никогда не исчезает - это вызывает утечку памяти.
Есть два способа решения этой проблемы. Либо autorelease
выделенный объект, как вы видели в фрагменте кода, который вы цитировали, либо вы назначаете выделенный объект временной переменной, сохраняете временную переменную для свойства locationManager
, а затем явно освобождаете временную переменную:
CLLocationManager *_temporaryReference = [[CLLocationManager alloc] init];
self.locationManager = _temporaryReference; // this is retained
[_temporaryReference release];
Оба подхода эквивалентны с точки зрения управления памятью. Некоторые предпочитают этот второй подход, потому что им не нравится ждать, пока пул автоматического выпуска будет «очищен», особенно на устройстве с малым объемом памяти, таком как iPhone, и это обеспечивает более жесткий контроль над продолжительностью жизни объекта.
Apple Язык программирования Objective-C Документация объясняет этот атрибут более подробно.