【问题标题】:How to release subviews如何发布子视图
【发布时间】:2023-03-28 19:49:01
【问题描述】:

在我的 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];

我的困惑是图像视图和按钮是否存在如果

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

    正如我在这里所做的那样,在添加子视图后立即释放对象。 这将导致我的确定按钮不值得。并且不会影响按钮点击。

    所以,在从 superview 中删除时,我应该写。

[[customalertview subviews] 发布];

【问题讨论】:

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


    【解决方案1】:

    您的代码是正确的。

    在将它们添加到警报视图后释放它们,因为警报视图负责保留它们。当你调用removeFromSuperview时,它会自动释放。

    【讨论】:

    • removefromsuperview 将如何释放对象?
    • file:///Library/Developer/Shared/Documentation/DocSets/com.apple.adc.documentation.AppleiOS5_0.iOSLibrary.docset/Contents/Resources/Documents/documentation/UIKit/Reference/UIView_Class /UIView/UIView.html#//apple_ref/occ/instm/UIView/removeFromSuperview
    • "removefromsuperview 将如何释放对象?" ——没关系。您应该使用的逻辑是,如果您保留、复制或分配对象,则释放它;否则,你不会。您已经平衡了 allocrelease,所以您的工作已经完成。
    • 实际上,我发现了一个错误:你根本不应该发布btnOK。由于您使用buttonWithType: 方法创建了btnOK,因此它已经自动释放,因此您无需执行任何操作。
    【解决方案2】:

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

    • 视图保留其子视图 - 因此,如果您创建一个新的视图对象,并将其作为子视图添加到其他对象中,则可以安全地释放它,除非您想自己为它保留一个引用。
    • 当视图从其父视图中移除时,它会被释放。因此,如果没有更多对象保留它,它将被释放。
    • 当一个视图被释放时,它会自动释放它的所有子视图,依此类推。

    尽快启用 ARC。

    【讨论】:

      【解决方案3】:

      你做对了。 customalertview 会自动释放它的子视图。

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

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

      希望它能帮助您了解事情的运作方式。

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

      编辑:

      我忘了提到,您也需要在删除自定义警报后发布它。

      如果你不了解内存管理你也可以看看:http://cocoadevcentral.com/d/learn_objectivec/ section 7

      【讨论】:

      • 你的第 3 段是“当你删除警报时,警报将被释放,它保留的所有东西也将被释放。”
      • 如果我删除它如何发布?
      • 不保留会自动释放。
      • 但是我已经为他们的(非原子,保留)设置了属性。所以,我发布了关于 dealloc 方法的 customalertview。
      • 所以如果你不释放customalertview,它只会在你的dealloc被调用时才会真正释放。
      猜你喜欢
      • 2011-05-18
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 2019-12-15
      相关资源
      最近更新 更多