如何发布子视图

时间:2012-04-02 12:22:25

标签: iphone objective-c ios xcode memory-management

在我的iPhone / iPad应用中,

我在主视图中添加了一个子视图。

此子视图有一个图像视图和按钮。

何时发布?

我的代码在这里,

 customAlertView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 600, 600)];


         UIImageView *imgv=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"celebration.png"]];

          UIButton *btnOK=[UIButton buttonWithType:UIButtonTypeCustom];

         [btnOK setTitle:@"OK" forState:UIControlStateNormal];
         [btnOK addTarget:self action:@selector(alertOKClicked) forControlEvents:UIControlEventTouchUpInside];

         [customAlertView addSubview:btnOK];
         [customAlertView addSubview:imgv];
         [self.view addSubview:customAlertView];

         [imgv release];
         [btnOK release];



In one another method I am writing the code.

  [customAlertView removeFromSuperview];

我的困惑是imageview,按钮就在那里

  1. 我在这里发布customalertview会自动发布其子视图。 如果是,则没问题。
  2. 如果没有如何释放它

    正如我在此处所做的那样,在添加子视图后立即释放了对象。 它会导致我的OK按钮不值得。并且不会影响按钮的点击。

    所以,我应该写一下从superview中删除。

  3. [[customalertview subviews] release];

3 个答案:

答案 0 :(得分:2)

您的代码是正确的。

在将它们添加到警报视图后释放它们,因为警报视图会保留它们。当您致电removeFromSuperview时,它会自动释放。

答案 1 :(得分:2)

根据您对现有答案的评论,我认为您缺少的要点如下:

  • 视图会保留其子视图 - 因此,如果您创建一个新的视图对象,并将其作为子视图添加到其他内容中,则可以安全地释放它,除非您想自己保留参考。
  • 当视图从其超级视图中删除时,它将被释放。因此,如果没有更多的对象保留它,它将被取消分配。
  • 当视图被取消分配时,它将自动释放所有子视图,依此类推在树下。

尽快启用ARC。

答案 2 :(得分:1)

你正在以正确的方式做到这一点。 customalertview将自动发布其子视图。

当释放计数变为0时,您的对象将被释放,这意味着在理论中,如果编码良好,则此对象不再具有任何引用。

当您在视图中维护自定义alertView时,您有一个保留您的东西的对象,因此在您删除customAlertView之前,释放计数不会为0,因为您已将它们添加到customAlertView,并且当您删除警报时,警报将被释放,它保留的所有东西也将被释放。

希望它能帮助您了解事情是如何运作的。

如果您想了解有关内存管理的更多信息,可以查看Apple文档here

修改

我忘了提到你删除后也需要释放自定义提醒。

如果您不了解内存管理,您还可以查看:http://cocoadevcentral.com/d/learn_objectivec/第7节