Почему всегда утечка при использовании CLLocationManager? - PullRequest
1 голос
/ 03 апреля 2011

myclass.m

- (id) init {
self = [super init];
if (self != nil) {
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];
    self.locationManager.delegate = self; // send loc updates to myself
}
return self;

}

- (void)dealloc {

[locationManager release];

[super dealloc];

}

Я использую прибор для проверки утечки. Утечка всегда указывает на

self.locationManager = [[[CLLocationManager alloc] init] autorelease];

Почему?

Ответы [ 3 ]

4 голосов
/ 04 апреля 2011

Я использую прибор для проверки утечки.Утечка всегда указывает на

self.locationManager = [[[CLLocationManager alloc] init] autorelease];

Почему?

Потому что это строка кода, где выделение, которое просочилось произошло.Поскольку вы правильно уравняли оба подразумеваемых значения retain в этом коде (когда-то здесь, один раз в -dealloc - предложение mmccomb о прямом назначении без autorelease хорошо, но не решит проблему), утечка в другом месте.

В частности, утечка будет retain, которая не будет сбалансирована release.Таким образом, где-то вы сохраняете объект, а не отпускаете его.

Инструменты могут использоваться для отображения всех событий сохранения / освобождения любого данного объекта.Используйте это и просмотрите список событий, связанных с вашим утечкой объекта.Будет еще один удержать, чем освободить.Соедините с удержаниями и выпусками.Причиной является то, что сохранение остается без сбалансированного выпуска.

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

0 голосов
/ 04 апреля 2011

Вы можете явно проверить количество сохранений в dealloc следующим образом:

NSLog(@"locationManager retain count: %d", [locationManager retainCount]);

Если оно больше 1, проверьте, где еще вы можете его сохранить - например, если вы присвоите его другому сохраняющему свойству (например, объявленному с ключевым словом retain). Вы можете добавить этот вызов NSLog в других местах до и после того, как вы что-то делаете с помощью locationManager, и посмотреть, где увеличивается количество сохраняемых данных. Иногда это может быть не сразу очевидно.

Другая возможность: вызывается ли метод dealloc? Возможно, весь объект "myclass" не выпущен должным образом? (Хотя я полагаю, что в этом случае вы также увидите утечку типа «myclass»).

0 голосов
/ 03 апреля 2011

Старайтесь избегать использования себя. нотация установки в методах инициализации. Когда объект инициализируется, нет гарантии, что он находится в согласованном состоянии. Измените вашу реализацию, чтобы напрямую установить ivar следующим образом ...

locationManager = [[CLLocationManager alloc] init];

Вам больше не нужен автоматический вызов, который ранее учитывал дополнительный счет сохранения, вызванный установщиком. Однако вам необходимо освободить объект в вашем методе dealloc (как вы уже делаете).

...