【问题标题】:Correctly deallocating a view正确释放视图
【发布时间】:2010-12-30 22:50:54
【问题描述】:

在基于视图的应用程序中,我显示一个视图,一旦用户完成该视图,单击完成并删除该视图。但是,这不会释放视图,这是我想要做的。释放这种视图的正确方法是什么?

目前,在调用第二个视图之前,我将其取消。这似乎有效,第二个视图被重新初始化。但是,第二个视图销毁自己(removeFromSuperview 后为 nil)不是更合适吗?

第一视角:

//show next view
aView = nil;
if(aView == nil)
{
  aView = [[AView alloc] initWithNibName:@"aView" bundle:nil];
}
[self.view addSubview: aView.view];

在视图中单击完成

[self.view removeFromSuperview];

【问题讨论】:

    标签: iphone cocoa-touch memory-management uiview


    【解决方案1】:

    紧接着

    [self.view addSubview: aView.view];
    

    你应该添加:

    [aView release];
    

    您的子视图已被视图控制器的视图保留,因此可以释放。

    【讨论】:

    • 那行不通。我有一个 IBAction 连接到 aView 中的按钮。当我单击它时,我立即得到 EXC_BAD_ACCESS。按钮中的断点永远不会被命中。
    【解决方案2】:

    以上两个答案都是关于如何在目标 c 中管理内存的正确理论。

    根据开发文档:

    http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/removeFromSuperview

    调用 removeFromSuperview 实际上会为你调用 release,所以你没事,我想。

    【讨论】:

    • 不 - 它不会为您发布。永远不会调用子视图的 dealloc。与其说视图,不如说视图控制器。
    【解决方案3】:

    removeFromSuperview方法会自动释放“aView.view”,所以你不应该在第一个视图控制器中释放aView。我想你已经在头文件中声明了AView *aView,但你不需要。您可以像这样将 aView 声明为局部变量:

    // go to second view
    SecViewController *sec = [[SecViewController alloc] initWithNibName:@"SecView" bundle:nil];
    [self.view addSubview:sec.view];
    
    // go back
    [self.view removeFromSuperview];
    

    【讨论】:

    • 谢谢。我删除了头文件声明,它工作正常。
    【解决方案4】:

    如果您之前将 viewController 设置为第一响应者状态(例如响应运动事件),则响应者链将保留控制器。您必须让第一响应者辞职才能完全销毁控制器。

    [self resignFirstResponder];
    [self.view removeFromSuperview];
    

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2014-12-17
      • 1970-01-01
      • 2015-02-03
      相关资源
      最近更新 更多