Контроллер UIView загадочным образом освобождается - PullRequest
0 голосов
/ 17 мая 2010

У меня есть схема UINavigation со страницей приветствия, средней страницей и страницей подробностей.

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

Сегодня я реализовал MapView и его аннотации и все такое. Мило. А подробное раскрытие каждой выноски переносит вас на страницу подробностей точно так же, как если бы вы попали туда через таблицу. Прекрасный.

У меня также есть кнопка панели правой кнопки, которая выдвигается в режиме поиска. Оттуда вы можете искать данные, по которым я перемещаюсь. Когда он завершает фильтрацию данных (массив объектов, которые я храню в одноэлементном хранилище данных), он заставляет таблицу перезагружать свои данные и вызывает мои методы annotation-clearer-and-builder в представлении карты, а затем выскакивает сам. так что «средняя» страница (включая все, что было в ее представлении) вернулась на экран.

Проблема в том, что если я пару раз перехожу между картой и поиском, любое упоминание о табличном представлении приводит к сбою: *** -[CALayer retain]: message sent to deallocated instance 0x710b810. (У меня явно включены NSZombies.)

Я поместил NSLog в метод dealloc моего контроллера табличного представления. Эту вещь никогда не вызывают. Я не знаю, закидываем ли мы это за кулисы в целях памяти, или я сливаю это и не могу вернуть свои руки, или что. Я в недоумении о том, где искать. Есть намеки?

EDIT:

Вот код, где я меняю контроллеры для основного вида моего «среднего» viewController:

- (IBAction)switchView:(id)sender
{
    UISegmentedControl *seg = (UISegmentedControl *)sender;
    NSInteger choice = [seg selectedSegmentIndex];

    NSArray *array = [mainView subviews];
    UIView *oldView = [array objectAtIndex:0];
    [oldView removeFromSuperview];

    if (choice == 0) {
        if (!self.tableController)
            self.tableController = [[EventsTableViewController alloc]
                    initWithNibName:@"EventsTableView" bundle:nil];
        [mainView addSubview:self.tableController.view];
    }

    if (choice == 1) {
        if (!self.calendarController)
            self.calendarController = [[EventsCalendarViewController alloc]
                        initWithNibName:@"EventsCalendarView" bundle:nil];
        [mainView addSubview:self.calendarController.view];
    }
    if (choice == 2) {
        if (!self.mapController)
            self.mapController = [[EventsMapViewController alloc]
                        initWithNibName:@"EventsMapView" bundle:nil];
        [mainView addSubview:self.mapController.view];
    }
}

Согласно Адаму ниже, я делаю removeFromSuperview там. Я пытался вставить сохранение в oldView непосредственно перед его удалением, но это не помогло.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 мая 2010

Я нашел это. В моем контроллере представления поиска я передал ссылку на UITableView в предыдущем представлении, чтобы я мог вызвать на нем refreshData после фильтрации исходных данных.

Я установил его как свойство (nonatomic, assign), что казалось правильным, но затем, во время освобождения, я пошел дальше и сказал [выпуск theTableView]. На самом деле это второй раз, когда у меня появляются таинственные и давние ошибки, потому что я что-то переоценил. Я планирую научиться на этот раз.

0 голосов
/ 18 мая 2010

Используете ли вы removeFromSuperview? Знайте, что это выпускает так же как удаляет из superview ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...