#ios #cllocationmanager #xcode4.2 #automatic-ref-counting
#iOS #cllocationmanager #xcode4.2 #автоматический подсчет ссылок
Вопрос:
Я новичок в разработке iOS и пишу приложение для определения местоположения с 3 видами. Первое представление — это основное представление приложения, второе представление — это табличное представление с несколькими местоположениями, а третье представление — это подробное представление, где пользователь может редактировать или добавлять новые местоположения в табличное представление.
Я использую CLLocationManager в первом и в третьем представлении, но каждое представление обоих имеет свои собственные экземпляры CLLocationManager, потому что для подробного просмотра мне нужна наилучшая точность, тогда как в MainView мне не нужна лучшая точность.
Итак, вот в чем проблема: в моем AppDelegate.m Я получил уведомление, которое срабатывает, когда приложения выходят на передний план:
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[[NSNotificationCenter defaultCenter] postNotificationName: @"didEnterForeground" object: nil userInfo: nil];
}
В моем третьем представлении, DetailViewController.m, я регистрируюсь в viewDidLoad для этого уведомления:
- (void) viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(enteredBackground:) name: @"didEnterBackground" object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(enteredForeground:) name: @"didEnterForeground" object: nil];
}
Метод enteredForeground в DetailViewController.m просто должен снова запустить диспетчер местоположений (метод didEnterBackground остановил его)
- (void) enteredForeground: (NSNotification*) notification {
[self.locationManager startUpdatingLocation];
}
Я использую XCode 4.2 с ARC.
Проблема в том, что если я посетил DetailView примерно 10 раз, перейдите в background (например, из MainView), затем я снова вхожу в foreground, после чего немедленно будут запущены 10 LocationManagers (это то, что говорит мой NSLog).
Похоже, что для DetailView (и для других представлений) существует такое же количество экземпляров, как и количество посещений для этих представлений.
Может быть, представления не будут выпущены должным образом, если они исчезли, возможно, из-за NSNotification ?!
Я был бы признателен, если бы кто-нибудь мог мне помочь в этом вопросе, потому что так много LocationManagers будут сильно нагружать батарею.
Заранее спасибо!
Ответ №1:
Я считаю, что вам нужно stopUpdatingLocation
это делать, когда это уходит на задний план. В противном случае он породит несколько экземпляров.
Комментарии:
1. да, я уже это делаю. Метод didEnterBackground вызывает stopUpdatingLocation ….