XCode представляет собой несколько экземпляров одного и того же представления

#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 ….