【发布时间】:2010-12-30 22:04:04
【问题描述】:
我有这个具体的问题,但是如果您发现我最初的设计想法很疯狂并且有更好的建议,请告诉我:)
我有一个 UIView 作为添加其他视图的容器/背景。重要的是一次只出现一个视图。因此,在添加任何视图之前,我会这样做:
for(UIView *v in [self.currentView subviews]) {
[v removeFromSuperview];
}
self.currentView 是我添加子视图的视图。
之后我以这种方式添加一个新的 UIView:
UIView *tempView;
switch (self.currentIndex) {
case 1:
tempView = [[AView alloc] initWithFrame:frame];
[self.currentView addSubview:tempView];
[tempView release];
break;
case 2:
tempView = [[AView alloc] initWithFrame:frame];
[self.currentView addSubview:tempView];
[tempView release];
break;
default:
break;
}
这样我删除了所有视图,因为我在添加 tempView 后立即释放它 self.currentView 我最终在当前生活的 UIView 上保留了一个 在当前视图中。
这一切看起来都很好,但是当我使用 Instruments 进行查看时,我可以看到每次运行上面的代码时都会分配一个新的 AView 对象,而旧的 AView 对象会一直挂着,保留计数为 1,要么我是缺少对我的对象执行的一些明显的保留操作,否则“removeFromSuperView”不会在我的视图上调用“释放”。
在现实生活中,我的对象不是 AView 类型,而是许多不同的类型,但这样我可以测试是否总是只分配一个 AView 实例。
正如我从文档中看到的那样,“removeFromSuperView”应该在视图上调用“释放”,所以我有点困惑为什么我的视图没有被释放。
再一次,也许我的做法是错误的,非常欢迎提出建议。 设置是屏幕底部有多个按钮,当用户点击视图时会发生变化。
感谢您提供的任何帮助或指点:)
【问题讨论】:
-
如果一次只存在一个视图,那为什么要使用循环来删除视图?
-
那是为了……在语法中做什么?我认为objective-c 不支持...in。
-
大家好,谢谢。 for 循环主要是通过断点测试删除了多少视图,它总是只运行一次。我可以看到我在枚举它时正在更改集合,这可能是一个问题。但它会有所作为吗?删除代码是为那里的单个视图运行的...... for..in 应该没问题:) 到目前为止它已经工作了。可能是保留对对象的引用的循环吗?再次感谢
标签: iphone memory-management uiview