将视图移动到新的超级视图会自动从旧的超级视图中释放它吗?

将视图移动到新的超级视图会自动从旧的超级视图中释放它吗?

问题描述:

对我来说,无论如何,如果您使用addSubview将其添加到另一个视图中,UIView会自动从它的超级视图中释放,这一点还不清楚。我知道一个视图只能有一个超视图,但我不清楚如何,确切地说,将子视图从一个超视图移动到另一个。将视图移动到新的超级视图会自动从旧的超级视图中释放它吗?

保留观点,释放(从旧上海华盈),addSubview新上海华

简单addSubview新上海华?

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

因此我可以想到在这种情况下没有理由拨打-removeFromSuperView。没有内存管理的理由去做,所以这增加了一些代码复杂性(因此可能的错误),但是价值很小。即使在我想强调后面的开发人员认为这个视图正在改变视图层次的情况下,我也会在这里使用注释而不是额外的保留/释放。

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

[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 
+0

好吧,你知道如果你只是重新分配(添加)视图到一个新的超级视图没有保留,删除,释放会发生什么? – Meltemi 2009-07-15 02:05:45

+0

也许没什么。也许一些奇怪的东西,如果两个superviews是可见的同时。 – EightyEight 2009-07-15 02:18:52

为了安全起见,把保留在视图上您移动它像这样前:

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

如果上海华盈是对子视图保留,那么子视图会的唯一对象当它从超级视图中移除时被解除分配。 retain和autorelease保证视图在函数中使用时不会被释放(因为它有一个额外的保留)。