Приложение аварийно завершает работу каждый раз, когда в настройках контроллера навигации выбирается строка таблицы - PullRequest
0 голосов
/ 25 марта 2010

Отказ от ответственности в первую очередь: я довольно плохо знаком с Objective-C и моделью сохранения. Последние пять лет я занимался разработкой среды .NET для сбора мусора, поэтому был избалован. Я все еще учусь.

У меня происходит сбой приложения iPhone с EXC_BAD_ACCESS. Это происходит в настройках контроллера навигации / просмотра таблицы. Когда я выбираю строку в первый раз, никаких проблем. Включает дочерний контроллер без проблем. Я возвращаюсь и снова выбираю такую ​​же строку. Программа затем завершается сбоем. Все остальные строки работают нормально, но каждый второй раз, когда к строке обращаются, это сбой.

Я точно определил место, где это происходит. Дочерний контроллер (который является классом, который я повторно использую для каждой строки одного и того же типа), в который переключается, имеет массив NSString, представляющих строки, которые будут отображаться. Я установил его, прежде чем нажать дочерний viewcontroller. Там, где это, по-видимому, происходит.

Мне трудно отладить эту проблему, я все еще борюсь с xcode и всем остальным. Боюсь, что здесь может отсутствовать некоторая жизненно важная информация, но, возможно, вы что-то узнаете.

Ответы [ 2 ]

2 голосов
/ 25 марта 2010

Включить NSZombies.

http://www.cocoadev.com/index.pl?NSZombieEnabled

Это поможет вам идентифицировать объект, который переиздан (вероятно, что происходит).

0 голосов
/ 30 марта 2010

Итак ... [UINavigationController pushViewController] не сохраняет, не так ли? ;) То, что я сделал, было инициализировал / выделил контроллер, который должен был быть помещен в стек навигации, нажмите его и затем отпустите. Я думал, что навигационный контроллер сохранит контроллер. По-видимому, это не так. Очевидно, это сработало с первого раза, но не во второй. Я думаю, что там память действительно освободилась. Включение зомби показало, что он получает сообщения (от сеттеров) к освобожденному объекту.

Почему я думал, что pushViewController сохранит контроллер? Я не знаю; Я думаю, что я запутался, думая, что если вы распределяете его, вы также несете ответственность за его устранение. Я почему-то думал, что после нажатия на него будет ответственность контроллера навигации. Кажется, я был неправ.

Я все еще учусь чувствовать это (злой C # и сборка мусора зажгли мой разум!). Кому-нибудь есть что добавить?

Чтобы проиллюстрировать это, похоже, это было неправильно:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     NSUInteger section = [indexPath section];
 NSUInteger row = [indexPath row];

 if (selectionController == nil)
 {
  selectionController =
   [[ConfigSelectionViewController alloc] initWithStyle:UITableViewStyleGrouped];
 }

 NSString *title = [self titleForSection:section row:row];
 NSString *key = [self keyForSection:section row:row];

 selectionController.configKey = key;
 selectionController.title = title;

 NSArray *listItems = [self itemsForSection:section row:row];
 selectionController.list = listItems;

 [self.navigationController pushViewController:selectionController animated:YES];

        // DON'T DO THIS!
        [selectionController release];


}
...