Ios 从SuperView中删除/释放UIView的适当方式

Ios 从SuperView中删除/释放UIView的适当方式,ios,cocoa-touch,Ios,Cocoa Touch,我正在玩iOS应用程序中的绘图。我有一个类,它是UIView的一个子类,它画了一些线条和东西。当用户按下按钮时,我实例化该类并在应用程序的主UIViewController视图上执行addSubView。用户按下该按钮的次数越多,该类的实例就越多地添加到视图中。它工作得很好 现在,我想为用户提供一种删除其中一个视图的方法。到目前为止,我已经将一个[self-removeViewFromSuperview]放入自定义UIView的touchesbeated方法中。因此,当用户按下图形时,它将从视图

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

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

另一方面,如果我要在主窗口的
UIView
上设置切换开关来切换删除,那么如果该切换开关设置为delete=yes,我如何从touchsbegind中进行检查?在
AppDelegate
中是否有某种布尔变量,我可以从
UIView
子类中进行检查?我该如何引用它

谢谢你的帮助,

有状态

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

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

如果您使用
alloc/init
创建
UIView
,将其添加到superview中,然后释放视图,superview将保留它。当使用
removeViewFromSuperview
删除它时,它将被解除锁定。

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

我通常在添加视图后自动删除视图,将父视图保留为唯一的引用


至于检查切换,您可以添加一个IBOutlet,以便直接检查它。(这可能不是纯MVC,但我不知道是否将其放在[UIApplication sharedApplication]中。委托必然更干净。)

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


至于检查切换,您可以添加一个IBOutlet,以便直接检查它。(这可能不是纯MVC,但我不知道是否将其放在[UIApplication sharedApplication]中。委托必须更干净。)

如果您像这样添加视图:

UIView *viewBeingAdded = [[[UIView alloc] init] autorelease];
[view addSubview:viewBeingAdded];
您可以在不泄漏内存的情况下删除它:

[theViewAboutToBeRemoved removeFromSuperview];
关于
ui开关
,您不需要将其值保留在任何地方,除非您需要它用于其他用途。您可以直接访问其值:

if ([theSwitch isOn]) { ... }
您甚至不需要
IBOutlet
,您可以使用其标签访问交换机:

UISwitch *theSwitch = (UISwitch *)[view viewWithTag:<# switch tag number #>];
if ([theSwitch isOn]) { ... }
UISwitch*theSwitch=(UISwitch*)[查看带标记的视图:];
如果([开关]{…}

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

如果您像这样添加视图:

UIView *viewBeingAdded = [[[UIView alloc] init] autorelease];
[view addSubview:viewBeingAdded];
您可以在不泄漏内存的情况下删除它:

[theViewAboutToBeRemoved removeFromSuperview];
关于
ui开关
,您不需要将其值保留在任何地方,除非您需要它用于其他用途。您可以直接访问其值:

if ([theSwitch isOn]) { ... }
您甚至不需要
IBOutlet
,您可以使用其标签访问交换机:

UISwitch *theSwitch = (UISwitch *)[view viewWithTag:<# switch tag number #>];
if ([theSwitch isOn]) { ... }
UISwitch*theSwitch=(UISwitch*)[查看带标记的视图:];
如果([开关]{…}

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

如何创建UIView?如何创建UIView?