UIBarButtonItem завершает работу приложения iphone при нажатии кнопки
-
21-08-2019 - |
Вопрос
UIBarButtonItem *rButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:NULL];
rButton.action = @selector(refreshAction);
self.navigationItem.rightBarButtonItem = rButton;
[rButton release];
Приведенный выше код отлично работает для создания кнопки и добавления ее на панель навигации, но когда я нажимаю на кнопку, приложение завершает работу с EXC_BAD_ACCESS.Если я закомментирую RButton.action = @selector(refreshAction);нажатие на кнопку ничего не даст, но и не приведет к сбою.
- (void)refreshAction {
NSLog(@"refreshAction");
}
Этот код находится в методе viewDidLoad TableViewController viewDidLoad, который помещается в стек NavigationController из метода viewDidLoad NavigationViewController.
Я потратил, наверное, 3 часа, пытаясь заставить это сработать, но безрезультатно.
Решение
Как обычно, виной всему было управление памятью.Загрузка TableViewController из NavigationController:
NearbyTableViewController *tableController = [[[NearbyTableViewController alloc] initWithNibName:@"NearbyTableViewController" bundle:nil] autorelease]; self.nearbyTableController = tableController;
[self pushViewController:self.nearbyTableController animated:YES]; [tableController release];
освобождение объекта, установленного для автоматического освобождения...должно быть, это самая распространенная ошибка в управлении памятью.Удаление этой строки [TableController release] решило проблему
Другие советы
Будет ли удача, если вы укажете @selector(refreshAction)
когда вы создаете кнопку, т.е.:
UIBarButtonItem *rButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshAction)];
Возможно, цель не будет сохранена, если вы также не укажете действие для инициализатора.
Я не совсем на 100% уверен, почему ваш код не работает, но установка селектора непосредственно в конструкторе действительно работает:
UIBarButtonItem *rButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
target:self
action:@selector(refreshAction)];