【问题标题】:Problem releasing object using "removeFromSuperView" iPhone使用“removeFromSuperView”iPhone 释放对象时出现问题
【发布时间】: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


【解决方案1】:

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

试试

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

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

改为。

【讨论】:

  • 这对可可来说太大了:while ([self.currentView subviews].count>0) { UIView *v = [[self.currentView subviews] objectAtIndex:0]; [v removeFromSuperview];工作得更好。但是分配的 AViews 数量仍然增加。我开始了仪器/对象分配。勾选了“Created and Still living”,然后我不断地运行这段代码,可能有什么问题?
  • 您确定要使用 Instruments 审核保留/释放列表并查看堆栈以查看哪些对象锁定了您的 AView?我似乎记得 Cmd+E 在 Instruments 中显示此信息时很有用。如果您以前没有使用过该功能,请尝试创建一些简单的测试 NSObject 子类进行比较,以便您可以比较完整版本和失败版本的审计跟踪列表的外观 [retain>0)?你在看什么,瑞奇?
  • 我将我的 Xcode 更新到了 3.2.1 版,现在看来子视图是使用 removeFromSuperView 真正发布的。也许“没有勺子”,而 Instruments 根本就没有做对。我还运行了静态分析器,我猜它会立即发现此类潜在问题。但它回来时很干净,所以我相信没有泄漏。再次感谢您的意见:)
【解决方案2】:

您可以尝试“bringSubviewToFront”和“sendSubviewToBack”函数,而不是每次都创建一个新的 UIView。这样一来,您就不会为每个操作都创建 uiview,从而减少应用程序的内存消耗。

【讨论】:

  • 您好 learner11,感谢您的意见。我有一个带有 X 个页面的滚动视图,每个页面都可以包含上述视图中的 Y 个。这意味着如果我有 10 个页面和 6 个上述视图(在“Z”方向的视图的 X 方向的页面)。用户一次可能在内存中拥有 60 个视图。这是我希望确保完全清理所有内容的主要原因。这样,用户最多可以加载 10 x 1 视图并在它们之间滚动而无需进行任何加载。这完全在我愿意在这里捆绑的记忆中。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多