UILabel/UIbutton等如何从内存中释放它们后仍能工作?

问题描述:

例如:UILabel/UIbutton等如何从内存中释放它们后仍能工作?

 UILabel *lblEmail = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, 70, 30)]; 
[lblEmail setBackgroundColor:[UIColor clearColor]]; 
[lblEmail setText:@"Email"]; 
[lblEmail setTag:1]; 
[contentView addSubview:lblEmail]; 
[lblEmail release]; 

在上面的代码中,我们创建一个的UILabel和释放,因此没有内存引用了,但它仍然当我运行的应用程序的作品。我们也可以使用viewWithTag来改变它的值。其他的例子是我创建一个按钮并释放它,但仍然在用户点击它工作的按钮时。

内容视图保留了标签/按钮,所以它仍然存在。你创建它的保留计数为1,将它添加到contentView使其保留计数为2,并释放它使其保留计数为1。所以它仍然在。

它没有从内存中释放。你只是释放你的它的保留。当你将它作为contentView的子视图添加时,它将保留在那里。

+0

是的,我知道这一点保留......但让我们在我的内容观点有10个标签和文本框10登记表的情况下......然后我的内容查看保留计数是21 ...我如何管理这种情况? – Prabh 2011-04-19 15:36:58

+0

你可以通过遵循一个简单的规则来管理它......如果你负责创建(alloc/init,copy等)或保留一个对象,你有责任释放。 – MarkPowell 2011-04-19 15:40:13

+0

您的contentView保留计数不是21.如果您添加10个标签和10个textField,则每个标签和文本字段的保留计数为1,并且contentView本身的保留计数为1(假定应用程序中没有任何其他保留这些对象)。 – Christian 2011-04-19 16:36:36

Apple Docs状态- (void)addSubview:(UIView *)view保留查看并将视图的下一个响应者设置为接收者,即其新的超级视图。

lblEmail只有在引用计数为0时才会被释放。它由contentView保留。

阅读Apple的文档addSubview

- (void)addSubview:(UIView *)view 

要添加的视图。这一观点是由接收

Apple Documentation for UIView