代码之家  ›  专栏  ›  技术社区  ›  bugfixr

如何卸载子视图?

  •  0
  • bugfixr  · 技术社区  · 15 年前

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

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

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

    [self.navigationController popViewControllerAnimated:YES];
    

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

    有没有一个正确的方法来“完全卸载”视图,以便下次显示时它是新鲜的?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jasarien    15 年前

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

    目前,您的视图控制器从未被解除分配,并且正在被泄漏:

    • 已分配(保留计数1)
    • 推入保留视图控制器的导航堆栈(保留计数2)
    • 然后从堆栈中弹出,释放它(保留计数1)
    • 从那以后就再也不发行了

    至于为什么要获取以前的值,每次将同一个实例推送到堆栈时,都必须推送它,而不是创建一个新的实例——我无法判断,因为您还没有发布所有相关代码。

        2
  •  0
  •   Rog    15 年前

    您需要在viewDidUnload上释放主视图的所有保留子视图。。。

    例如,如果通过在IB中将UI元素声明为outlets而保留了UI元素,则在dealloc上释放它们之前将其设置为nil。

    下面是一个例子:

    @接口。。。

    {
       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;
        ...
    }