3

无论如何,对我来说还不清楚,如果您使用 addSubview 将 UIView 添加到另一个视图中,它是否会自动从其父视图中释放?!?我知道一个视图只能有一个超级视图,但我不清楚如何将子视图从一个超级视图移动到另一个超级视图。

保留视图,释放(从旧的超级视图),将子视图添加到新的超级视图

或者

只需将子视图添加到新的超级视图?

4

3 回答 3

4

对于视图是否在-removeFromSuperView被调用时释放的问题,它是,这在 UIView 参考中有所记录-removeFromSuperView。它没有明确说明-addSubView:调用-removeFromSuperView,但它是隐含的,可以通过-removeFromSuperView在 UIView 子类中重载来测试。

因此,我想不出-removeFromSuperView在这种情况下打电话的理由。这样做没有内存管理的理由,所以这增加了一些代码复杂性(因此潜在的错误)几乎没有价值。即使在我想向后来的开发人员强调这个视图正在改变视图层次结构的情况下,我也会在这里使用注释而不是额外的保留/释放。

于 2009-07-15T02:19:14.947 回答
2

将视图添加到超级视图会保留该视图,从超级视图中删除视图会释放它。

[subview retain]; // because next line will release
[subview removeFromSuperView]; // released by superview
[otherSupView addSubview:subview]; // retained by new superview
[subview release]; // because you retained it in line 1
于 2009-07-15T01:38:22.957 回答
2

为了安全起见,请在移动视图之前将其保留,如下所示:

[[theView retain] autorelease];
[theView removeFromSuperview];
[newSuperview addSubview:theView];

如果父视图是唯一在子视图上具有保留的对象,则子视图将在从父视图中删除时被释放。保留和自动释放保证了当你在函数中使用它时视图不会被释放(因为它上面有一个额外的保留)。

于 2009-07-15T01:38:46.030 回答