2015-02-08 3 views
0

Документация Apple гласит: «Когда срабатывает segue, он запускает новый контроллер представлений и переходит на экран». Некоторое поведение, которое я вижу, вызывает у меня вопрос о том, действительно ли VC уничтожен и воссоздан каждый раз, когда просматривается представление.viewController lifecycle

В моем приложении каждый раз, когда я seque к определенному мнению Хочу отметить, что следующая функция ViewController называется (что согласуется с ВК воссоздается каждый раз, когда он sequed к):

- (id)initWithCoder:(NSCoder *)aDecoder 

Примечание этот ViewController также источник данных для его CollectionView и обладает свойством:

@property (strong, nonatomic) NSMutableArray *messages; 

и каждый раз, когда initWithCoder называется я Alloc и инициализировать массив сообщений и назначить его над указателем.

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

Первое, что странно, это то, что в viewDidLoad, если я вызываю addObserver: self для конкретного уведомления, которое я хочу, чтобы этот VC обрабатывал, во второй раз, когда я перехожу в этот VC, я получаю два уведомления, отправленные на уведомление VC обработчик для каждого отправленного уведомления. Это согласуется с повторным использованием VC, иначе почему обработчик будет вызван дважды?

Но, несмотря на это, сценарий повторного использования заключается в том, что initWithCoder на самом деле называется вторым при загрузке представления.

Поскольку я не хочу получать 2 или более уведомлений для каждого сообщения, я использую статическое логическое значение, чтобы гарантировать, что addObserver вызывается только один раз. То есть addObserver вызывается только при первом вызове viewDidLoad, а не в последующем.

viewDidLoad и обработчик уведомлений получают доступ к массиву сообщений. Во втором сегменте viewDidLoad, похоже, обращается к новому массиву сообщений alloc/init'd, но когда обработчик уведомлений обращается к сообщениям, он кажется предыдущим массивом сообщений с предыдущего времени загрузки VC.

Любые идеи?

ответ

0

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

+0

Да, я действительно думал об этом во время обеда, и я думаю, что в центре уведомлений содержится ссылка на viewController. – bhartsb