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

Я использую уведомления для передачи данных от контроллера подробного представления к rootviewcontroller в моем приложении. Методы работают нормально, пока не появится предупреждение о памяти.

Уведомление обрабатывается дважды после любых предупреждений о памяти.

Я передаю данные обратно в 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];
}

Спасибо за любую помощь.


person lostInTransit    schedule 01.07.2009    source источник


Ответы (2)


Я новичок в разработке iPhone, но до сих пор я заметил, что после предупреждения о памяти реализация метода didReceiveMemoryWarning по умолчанию заключается в выгрузке представления, если оно не отображается.

Я думаю, что в вашем случае контроллер корневого представления не виден и поэтому выгружен. Как только вы вернетесь к корневому контроллеру представления, метод viewDidLoad вызывается снова, и поэтому экземпляр контроллера представления (который сам не выгружается, просто представление есть) снова регистрируется в центре уведомлений.

Решением было бы зарегистрироваться в центре уведомлений во время инициализации, используя либо метод инициализации по умолчанию, либо метод initWithNibName:bundle:, либо метод initWithCoder:.

person drvdijk    schedule 01.07.2009
comment
просто предположите, что ваше представление будет загружаться и выгружаться несколько раз и кодируйте соответственно. - person David Maymudes; 01.07.2009

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

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

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

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

person Corey Floyd    schedule 01.07.2009