iOS在带有ARC的MutableArray中持有UIView引用

时间:2013-09-14 14:04:40

标签: ios memory-management uiview automatic-ref-counting

我尝试管理多个视图并将这些引用保存在可变数组中。 如果我在可变数组中添加视图引用并添加到视图中,则作为子视图。 然后引用计数似乎不正确。会导致错误的访问错误。

所以我的问题是有一种管理这些观点的好方法。 例如,如果我需要重用视图。没有使用时将它们保存在可变数组中,以后再重复使用。

编辑:

    NSMutableArray* reuseViews = [NSMutableArray arrayWithCapacity:0];
    for (int i=0; i<3; i++) {
        UIView* v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
        [reuseViews addObject:v];
        [self.view addSubview:v];
    }

    for (int i=0; i<3; i++) {
        UIView* v = [reuseViews objectAtIndex:i];
        [v removeFromSuperview]; // it also removes the reference in the array
        [reuseViews removeObject:v]; // will crash
    }

1 个答案:

答案 0 :(得分:2)

尝试删除第三个项目时,第二个for循环将崩溃。这是因为i的值为2,索引中的项目数为1.当您尝试将对象拉出数组时,它将崩溃。

要解决此问题,请等到循环之后删除所有对象:

for (int i=0; i<3; i++) {
    UIView* v = [reuseViews objectAtIndex:i];
    [v removeFromSuperview];
}

[reuseViews removeAllObjects];

更好的方法是使用快速枚举:

 for (UIView* v in reuseViews) {
    [v removeFromSuperview];
}

[reuseViews removeAllObjects];