我有这个具体的问题,但是如果你发现我最初的设计理念疯狂并有更好的建议,请告诉我:)
我有一个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当前居住的保留计数为1 在currentView。
这一切看起来都很好,但是当我用Instruments查看它时,我可以看到每次运行上面的代码时都会分配一个新的AView对象,旧的一个对象保持挂起,保留计数为1,要么我是缺少对我的对象执行的一些明显的保留操作,否则“removeFromSuperView”在我的视图中不会调用“release”。
在现实生活中,我的对象不是AView类型,而是有许多不同的类型,但是这样我可以测试是否总是只分配了一个AView实例。
正如我可以从文档中读到的“removeFromSuperView”应该在视图上调用“release”,所以我对于为什么我的视图没有被释放感到有些困惑。
再一次,也许我会以错误的方式解决这个问题,建议真的很受欢迎。 设置是屏幕底部有一些按钮,当用户点击视图更改时。
感谢您提供的任何帮助或指针:)
答案 0 :(得分:2)
您正在迭代一个集合并同时更改它
尝试
while ([self.currentView subviews].count>0) {
[[[self.currentView subviews] objectAtIndex:0] removeFromSuperView];
}
代替。
答案 1 :(得分:0)
你可以尝试“bringSubviewToFront”和“sendSubviewToBack”函数,而不是每次都创建一个新的UIView。这样,您就不会为每个操作创建uiviews,因此不会对应用程序的内存消耗产生压力。