Как справиться с потенциальной утечкой предупреждения об объекте — CLLocationManager

#iphone #ios #memory-management #core-location

#iPhone #iOS #управление памятью #ядро-местоположение

Вопрос:

Я выполнил сборку и анализ и был предупрежден о потенциальной утечке объекта, хранящегося в ‘LocationManager’. Мне было интересно, как с этим следует обращаться должным образом. Вот код:

// Код компаса

     CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    if ([CLLocationManager locationServicesEnabled] amp;amp; 
        [CLLocationManager headingAvailable]) {
        [locationManager startUpdatingLocation];
        [locationManager startUpdatingHeading];
        locationManager.headingFilter = 2; // 2 degrees

    } else {

    NSLog(@"Can't report heading");

    }
  

спасибо за любую помощь

Ответ №1:

В первой строке вы alloc диспетчер местоположений. Это означает, что вам принадлежит эта ссылка, и вы должны освободить ее, когда закончите.

Вам нужно либо отпустить диспетчер местоположений, когда вы закончите его настройку:

 // ...
locationManager.headingFilter = 2; // 2 degrees
[locationManager release];
  

Или автоматически удалите его в той же строке, в которой вы его выделили:

 CLLocationManager *locationManager = [[[CLLocationManager alloc] init] autorelease];
  

Сказав это, вам, вероятно, следует сохранить диспетчер местоположений в переменной экземпляра, чтобы в какой-то момент вы могли остановить обновления местоположения. В противном self случае может быть освобождено, и диспетчер местоположений продолжит отправлять сообщения этому освобожденному объекту. Это приведет к сбою.

После создания переменной экземпляра ваш dealloc, вероятно, должен иметь это:

 - (void)dealloc
{
    // ...
    locationManager.delegate = nil;
    [locationManager stopUpdatingLocation];
    [locationManager release];
    // ...
    [super dealloc];
}
  

Очистка делегата гарантирует, что диспетчер местоположений не будет отправлять нам никаких сообщений после того, как мы были освобождены. Затем мы останавливаем обновления местоположения и освобождаем переменную экземпляра, потому что она нам больше не нужна.

Ответ №2:

Иногда ручное освобождение переменных может быть рискованным. Мы не знаем, где именно освобождать переменные. Одна вещь, которую мы можем сделать, чтобы избежать ручной работы по освобождению переменных, — это щелкнуть проект в настройке сборки поиск для автоматического подсчета ссылок установите для него значение «ДА». Установив значение «ДА», нет необходимости освобождать переменные вручную.