iPhone — уведомление отправляется дважды после предупреждения о памяти
-
21-08-2019 - |
Вопрос
Я использую уведомления для передачи данных из контроллера подробного представления в контроллер rootview в моем приложении.Методы работают нормально, пока не появится предупреждение о памяти.
Уведомление обрабатывается дважды после любых предупреждений памяти.
Я передаю данные обратно в rootviewcontroller, когда пользователь выбирает строку в DetailViewController.Метод DidSelectRowAtIndexPath вызывается только один раз, а наблюдатель уведомлений вызывается дважды!
Должен ли я удалить уведомление в DidReceiveMemoryWarning?Или есть какие-то другие проблемы с кодом?
Публикация соответствующего кода
ViewDidLoad RootViewController
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rowSelected:) name:@"SelectionNotification" object:nil];
DidSelectRowAtIndexPath DetailViewController
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSMutableDictionary *dictionary = [[[NSMutableDictionary alloc] init] autorelease];
[dictionary setObject:selectedRow forKey:@"row"];
[[NSNotificationCenter defaultCenter] postNotificationName:kSelectionNotificationName object:self userInfo:dictionary];
[[self navigationController] popToRootViewControllerAnimated:YES];
}
Спасибо за любую помощь.
Решение
Я новичок в разработке для iPhone, но на данный момент я заметил, что после предупреждения о памяти реализация метода DidReceiveMemoryWarning по умолчанию заключается в выгрузке представления, если оно не отображается.
Я думаю в вашем случае корневой контроллер представления не виден, поэтому и выгружается.Как только вы вернетесь к корневому контроллеру представления, метод viewDidLoad вызывается снова, и поэтому экземпляр контроллера представления (который сам по себе не выгружается, а выгружается только представление) снова регистрируется в центре уведомлений.
Решением было бы зарегистрироваться в центре уведомлений во время инициализации, используя либо метод инициализации по умолчанию, либо метод инициализации. initWithNibName:bundle:
метод или в initWithCoder:
метод.
Другие советы
Как вы намекаете, если вы подпишетесь на уведомление дважды, вы получите его дважды.
Скорее всего, вы повторно создаете экземпляр освобожденного объекта и повторно подписываетесь на уведомление.
Установите точку останова, где вы подписываетесь на уведомления, и вы, скорее всего, нажмете ее дважды.
Здесь вы можете переопределить аксессор и отказаться от подписки на уведомления.Или вы можете сделать это с помощью КВО.