#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:
Иногда ручное освобождение переменных может быть рискованным. Мы не знаем, где именно освобождать переменные. Одна вещь, которую мы можем сделать, чтобы избежать ручной работы по освобождению переменных, — это щелкнуть проект в настройке сборки поиск для автоматического подсчета ссылок установите для него значение «ДА». Установив значение «ДА», нет необходимости освобождать переменные вручную.