【问题标题】:self removeFromSuperView don't release self?self removeFromSuperView 不释放自我?
【发布时间】:2012-07-13 05:28:07
【问题描述】:

我动态地将一个子视图添加到另一个uiview;

在子视图中,点击按钮返回,方法如下:

[self removeFromSuperView ];

但是在多次添加子视图并将其删除后,我的应用程序可能会崩溃,日志说它已被杀死。

我发现调用[self removeFromSuperView] 并没有释放自我。那么释放它的最佳方法是什么?

【问题讨论】:

  • 贴出添加子视图到父视图的代码。
  • 贴一些代码让我们理解

标签: iphone uiview crash


【解决方案1】:

如果您在创建时保留 UIView(或将其添加到数组中),则保留计数会增加。例如:

// Retain count is 1
UIView *myView = [[UIView alloc] initWithFrame:myFrame];

// Retain count is 2
[myParentView addSubview:myView];

// Retain count is 1 again
[myView removeFromSuperView];

在上面的例子中,你可以autorelease这个视图,如果它被立即添加为一个子视图,或者如果它是一个iVar,你可以在你的dealloc中释放它。

编辑:(可以保留您的观点的其他原因)

// Retain count +1
[myArray addObject:myView];

// Retained in the setter created by the @synthesize directive
@property(nonatomic, retain) UIView *myView;

在文档中声明该属性被保留的任何其他内容。

你还应该小心在 VC 的 loadView 方法中创建对象,如果你确保你释放它们,因为当调用 loadView 时它们会被再次创建。如果您的 VC 的视图被卸载然后重新加载,就会发生这种情况。

【讨论】:

  • 我这样添加子视图: UIView *myView = [[UIView alloc] initWithFrame:myFrame]; [myParentView addSubview:myView];添加后不释放。因为当我调用[self removeFromSuperView]时应用程序有时会崩溃;
  • 嗨,xxhp,如果您创建应用程序(保留 1)、添加子视图(保留 2)、释放视图(保留 1)、从 superView 中删除(发布 0,查看 dealloc'd),应用程序将崩溃。添加子视图(崩溃)。听起来您需要使用 iVar 并创建您的视图并将其释放到您的 VC 的 dealloc 中,如果您希望它保留下来,以便您可以在 superViews 中添加和删除。如果是这种情况,那么在您的 VC 也被解除分配之前,视图不会被解除分配。同样,您可以在 loadView 中创建它并在 viewDidUnload 中释放它。希望这会有所帮助,戴夫
【解决方案2】:

你应该首先释放。 “alloc”对应的是“release”,“addSubview”对应的是“removeFromSuperView”:保持平衡。

添加视图:

UIView *myView = [[UIView alloc] initWithFrame:myFrame];
[myParentView addSubview:myView];
[myView release];

删除视图(removeFromSuperView 后视图会在内存中清除):

[myView removeFromSuperView];

【讨论】:

    【解决方案3】:

    看起来您正在将保留视图添加为子视图。它的父视图再次保留它。 因此,当您单元格[self removeFromSuperView]; 时,它会从 superView 获取发布消息,但仍必须由创建者发布。

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2023-04-07
      • 2014-08-02
      • 1970-01-01
      相关资源
      最近更新 更多