所以... [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];
}