2010-05-12 4 views
1
- (void)launchSearch 
{ 
EventsSearchViewController *searchController = [[EventsSearchViewController alloc] initWithNibName:@"EventsSearchView" bundle:nil]; 
[self.navigationController pushViewController:searchController animated:YES]; 
//[searchController release]; 
} 

Уведомление [searchController release] закомментировано. Я понял, что нажатие searchController на контроллер навигации сохраняет его, и я должен отпустить его из моего кода. В конце концов, я просто выделил/запустил его, и если я не освобожу его, он просочится.UINavigationController и управление памятью

С этой строкой прокомментировал, что работа навигации прекрасна. С ним НЕ прокомментировал, я могу перемещаться по этому виду в порядке, но возвращаясь вверх, уровень падает с ошибкой *** -[CFArray release]: message sent to deallocated instance 0x443a9e0.

Что здесь происходит? Является ли NavigationController выпуском для меня каким-то образом, когда он выходит из поля зрения?

В шаблоне, который поставляется на шаблоне UINavigationController в XCode, вышел новый контроллер. Но когда я это делаю, он терпит неудачу.

--- EDIT ----

Так сегодня утром, сажусь, и она работает. Не знаю, почему. Вздох.

Принимая то, что, как я думал, я узнал и применил его к другой части этого же контроллера, я сделал следующее. Вчера у меня был этот код БЕЗ релизов, потому что с ними не получилось. Так сегодня утром я добавил их создания:

- (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) { 
     tableController = [[EventsTableViewController alloc] 
      initWithNibName:@"EventsTableView" bundle:nil]; 
      [mainView addSubview:tableController.view]; 
      [tableController release]; 
    } 

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

С его настроить так, когда я прихожу на взгляд, главный портал мой взгляд наполнен зрения EventsTableViewController, я могу нажать на MAPview и calendarView , но когда я перехожу на BACK в tableView, я умираю, потому что методы делегирования таблицы вызываются на освобожденном экземпляре.

Итак, я пошел и сделал все эти контроллеры синтезированными свойствами, поэтому я могу их освободить в [dealloc]. Кажется, что это работает, но реальный вопрос заключается в том, почему добавление этих представлений в качестве подзаголовков не сохраняет их, передавая право собственности на новое представление, в котором оно входит, позволяя мне выпускать их прямо там?

+0

Что произойдет, если вы закомментируете строку pushViewController, но раскомментируете строку выпуска? Сбой в выпуске? – MrHen

+0

Нет. Очевидно, что в пользовательском интерфейсе ничего не происходит, но NSLog сообщает мне, что он подходит к концу этого метода. Но дело не в том, что релиз падает даже тогда, когда его нажимают. Когда я возвращаюсь из поискового контроля, я просто нажал, вот когда я разбился. –

+0

Хорошо, это самое страшное. Сегодня утром это работает. Я оставил нажатие И релиз, и я не могу сделать его сбоем. Итак, я начал смотреть на другие места, на которых я нажимаю контроллеры на навигатор, где я оставил освобождение от них, потому что это не сработало иначе, и когда я добавил их обратно в еще одну странность. Я обновлю этот вопрос с соответствующим кодом. –

ответ

1

Ничего себе, ребята. Большое спасибо за все ваши ответы - трагически я отправил вас всех на ужасную goosechase.

My NavigationView осуществляет навигацию по объектам NSArray объектов Event (событиям местного искусства). Мой вид таблицы сводится к подробному представлению.

мой взгляд деталь имеет в нем следующее:

-(void)loadEvent:(Event *)event 
{ 
    thisEvent = event;   
} 

И я называю, что с моей точки зрения таблицы перед нажатием подробный вид на стек нав. thisEvent является синтезированным свойством типа Event, и поэтому, поскольку он синтезирован, я покорно release 'd его в [dealloc].

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

Я добавил retain к этому loadEvent: метод выше и сбои, они исчезли.

НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ НИКАКИЕ ИЗ НЕОБХОДИМО ОТНОСИТЬСЯ, ОТНОСЯЩИХСЯ К СВОЙСТВУ и ВЫПУЩЕННЫМ НАПРАВЕЛЕНИЕМ. Речь шла о случайном перевыпуске объектов данных, которые я просматриваю. Часть того, что я обнаружил, это было, я NSLogged себя в [dealloc] каждого из этих контроллеров представлений, и теперь я вижу, что они ведут себя так, как должны.

Спасибо! Я так люблю этот сайт.

0

Я предполагаю, что ошибка заключается в инициализации EventsSearchViewController. Верно ли это автореализованное «я» по ошибке?

+0

Только если его '[супер init]'. Я не переопределял его методы init. Я также должен отметить, что это не единственный ViewController, с которым это происходит. У меня есть другие места в этом приложении, где, если я явным образом освобождаю контроллеры после нажатия их на контроллер навигации, я получаю вызовы к отсутствующим объектам позже. –

+0

Предполагаю, что вы не используете searchController в другом месте вашего кода? После возврата функции navigationController это будет недействительным. – Andiih

+0

Нет, это единственное место. –

0

Похож, что EventsSearchViewController выделяет массив и затем высвобождает его, причем один из релизов, вероятно, находится в его dealloc.

Если вы закомментируете release, ваш EventsSearchViewController никогда не освобождается (он течет). Таким образом, ошибки, возникающие в результате собственного dealloc, будут замаскированы, так как этот метод не будет вызываться. Освобождение контроллера - это правильная вещь, но у вас есть еще одна ошибка в самом контроллере, которая появляется только во время dealloc.

Также может быть, что dealloc выпускает автореализованный массив, поэтому у вас может не быть двух явных сообщений о выпуске в вашем коде. Но это очень похоже на выпуск чего-то в dealloc, который вызывает проблему.

+0

Я бросил вам подделку с массивом бизнеса. Оказывается, что массив, о котором идет речь, использовался в этом контроллере, и я просто делал с ним что-то глупое. –

Смежные вопросы