iPhone — уведомление отправляется дважды после предупреждения о памяти

StackOverflow https://stackoverflow.com/questions/1067730

  •  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: метод.

Другие советы

Как вы намекаете, если вы подпишетесь на уведомление дважды, вы получите его дважды.

Скорее всего, вы повторно создаете экземпляр освобожденного объекта и повторно подписываетесь на уведомление.

Установите точку останова, где вы подписываетесь на уведомления, и вы, скорее всего, нажмете ее дважды.

Здесь вы можете переопределить аксессор и отказаться от подписки на уведомления.Или вы можете сделать это с помощью КВО.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top