Итак ... [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];
}