2012-07-13 71 views
2

我动态地将子视图添加到另一个uiview;self removeFromSuperView不释放自我?

在子视图,单击一个按钮通过下面的方法来回去:

[self removeFromSuperView ]; 

但经过曼尼次添加子视图,并删除它,我的应用程序可能会崩溃,日志说,被杀害了。

我发现拨打[self removeFromSuperView]没有释放自我。那么释放它的最好方法是什么?

+1

后它增加了子视图到parentview的代码。 – Apurv 2012-07-13 05:49:22

+0

发布一些代码,所以我们可以理解 – Hiren 2012-07-13 06:14:38

回答

4

如果您在创建时保留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视图如果立即添加作为一个子视图或释放它在你的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视图已卸载然后重新加载,则会发生这种情况。

+0

我添加子视图是这样的: UIView * myView = [[UIView alloc] initWithFrame:myFrame]; [myParentView addSubview:myView];并且在add.because之后不会释放,当我调用[self removeFromSuperView]时,应用程序有时会崩溃; – 2012-07-14 08:07:16

+0

嗨xxhp,应用程序将崩溃,如果你创建它(保留1),addSubview(保留2),释放视图(保留1),从超视图中删除(版本0,查看dealloc'd)。 addSubview(崩溃)。听起来就像你需要使用一个iVar并创建你的视图,并在你的VC的dealloc中释放它,如果你想让它坚持下去,所以你可以添加和删除superView。如果是这种情况,那么视图不会被解除分配,直到你的VC也被解除分配。同样,你可以在loadView中创建它,并在viewDidUnload中释放它。希望这有助于,戴夫 – 2012-07-14 09:41:30

+0

谢谢。我会试试这个。 – 2012-07-15 01:17:16

0

看起来像是将保留视图添加为子视图。其父母的观点再次保留下来。 所以当你的单元[self removeFromSuperView];它从superView获得释放消息,但仍然必须由创建者释放。

2

你应该首先发布。 “alloc”的对应部分是“释放”,“addSubview”的对应部分是“removeFromSuperView”:保持这些平衡。

add视图:

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

移除View(视图将在存储器removeFromSuperView后清理):

[myView removeFromSuperView]; 
+0

我试过这个,但是app有时会崩溃! – 2012-07-14 08:13:31