使用“removeFromSuperView”iPhone释放对象时出现问题

时间:2009-12-29 21:00:46

标签: iphone memory-management uiview

我有这个具体的问题,但是如果你发现我最初的设计理念疯狂并有更好的建议,请告诉我:)

我有一个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”,所以我对于为什么我的视图没有被释放感到有些困惑。

再一次,也许我会以错误的方式解决这个问题,建议真的很受欢迎。 设置是屏幕底部有一些按钮,当用户点击视图更改时。

感谢您提供的任何帮助或指针:)

2 个答案:

答案 0 :(得分:2)

您正在迭代一个集合并同时更改它

尝试

    while ([self.currentView subviews].count>0) {

    [[[self.currentView subviews] objectAtIndex:0] removeFromSuperView];
}

代替。

答案 1 :(得分:0)

你可以尝试“bringSubviewToFront”和“sendSubviewToBack”函数,而不是每次都创建一个新的UIView。这样,您就不会为每个操作创建uiviews,因此不会对应用程序的内存消耗产生压力。