如何卸载子视图?

时间:2010-11-25 18:26:06

标签: objective-c ios4

我有一个UITableView,可以在点击附件按钮时加载视图:

MyView *newView = [[MyView alloc]  ...];
[self.navigationController pushViewController:newView];

在视图中,当用户执行某个操作时,我会通过执行以下操作返回到UITableView:

[self.navigationController popViewControllerAnimated:YES];

这样可以,但是下次通过点击附件按钮访问视图时,它会保留第一次使用视图时包含的一些值。

有没有一种方法可以实际“完全卸载”视图,以便下次显示时它是新鲜的?

2 个答案:

答案 0 :(得分:1)

您应该autorelease newView(我假设它实际上是一个视图控制器,因为您将其推送到导航堆栈)。

目前看来,您的视图控制器永远不会被释放并且正在泄露:

  • 分配(保留计数1)
  • 推入保留视图控制器的导航堆栈(保留计数2)
  • 然后从堆栈中弹出它,释放它(保留计数1)
  • 之后再也没有发布

至于为什么你得到以前的值,你也必须推动相同的实例,而不是每次将它推到堆栈时创建一个新实例 - 我无法分辨,因为你还没有发布所有的相关代码。

答案 1 :(得分:0)

您需要在viewDidUnload ...

上发布主视图的所有保留子视图

例如,如果您通过在IB中将它们声明为出口来保留UI元素,则在将它们释放到dealloc之前将它们设置为nil。

以下是一个例子:

@interface ...

{
   IBOutlet UIButton *button;
   IBOutlet UITextLabel *label;
   IBOutlet UITableView *tableview;
}

@property (nonatomic, retain) UIButton *button;
...

然后你应该在viewDidUnload

上将它们设置为nil
- (void)viewDidUnload {
    self.button = nil;
    self.textlabel = nil;
    self.tableview = nil;
    ...
}