Как справиться с потенциальной утечкой объекта предупреждения - CLLocationManager - PullRequest
0 голосов
/ 30 сентября 2011

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

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

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

    } else {

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

    }

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

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

На первой строке вы 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];
}

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

0 голосов
/ 16 ноября 2013

Вручную освобождение переменных иногда может быть рискованным. Мы не знаем, где именно выпустить переменные. Единственное, что мы можем сделать, чтобы избежать ручного освобождения переменных, - это щелкнуть проект в настройке поиска Build для автоматического подсчета ссылок, установив для него значение «YES». При установке значения «ДА» нет необходимости вручную освобождать переменные.

...