在removeFromSuperview之后删除/释放UIView的适当方法

时间:2011-10-28 16:52:23

标签: ios cocoa-touch

我正在玩iOS应用程序中的绘图。我有一个类UIView的子类,它绘制了一些行和东西。当用户按下按钮时,我实例化该类并在应用程序的主addSubView视图上执行UIViewController。用户按下该按钮的次数越多,该类的实例就会被添加到视图中。它运作得很好。

现在我想为用户提供一种删除其中一个视图的方法。到目前为止,我已将[self removeViewFromSuperview]放入自定义UIView的touchesBegan方法中。因此,当用户按下绘图时,它将从视图中删除。但是,它实际上并没有删除,对吧?由于视图是在按下按钮时执行的方法中实例化的,因此我无法从UIViewController中引用它。有什么方法可以确保我不会因创建和删除UIView而浪费内存?

在相关的说明中,如果我要在主窗口的UIView上设置切换开关以切换删除,如何在touchesBegan中检查切换开关是否设置为delete = yes?我可以在AppDelegate中找到某种布尔变量,我可以在UIView子类中查看吗?我该如何参考?

感谢您的帮助,
有状态

4 个答案:

答案 0 :(得分:4)

如果您添加如下视图:

UIView *viewBeingAdded = [[[UIView alloc] init] autorelease];
[view addSubview:viewBeingAdded];

您可以在不泄漏内存的情况下将其删除:

[theViewAboutToBeRemoved removeFromSuperview];

关于UISwitch,您无需将其值保留在任何位置,除非您需要其他内容。您可以直接访问其值:

if ([theSwitch isOn]) { ... }

您甚至不需要IBOutlet,您可以使用其标记访问交换机:

UISwitch *theSwitch = (UISwitch *)[view viewWithTag:<# switch tag number #>];
if ([theSwitch isOn]) { ... }

在这种情况下,您必须在Interface Builder中或创建时为交换机设置唯一的标记号。

答案 1 :(得分:0)

当您执行[mainView addSubView:myView]时,mainView将保留myView。如果您使用alloc / init创建了myView,那么您也保留了它。如果在将其添加到主视图后不需要myView,则只需在添加后再执行[myView release]。当您从主视图中删除它时,它将被释放并取消分配。

答案 2 :(得分:0)

如果您使用UIView创建alloc/init,请将其添加到超级视图,然后释放视图,超级视图将保留该视图。当使用removeViewFromSuperview删除它时,它将被释放。

答案 3 :(得分:0)

我通常在添加视图后自动释放视图,让父视图成为唯一的引用。

关于检查切换,您可以添加IBOutlet,以便直接检查它。 (这可能不是纯粹的MVC,但我不知道是否将它放入[UIApplication sharedApplication] .delegate必须更清晰。)