0
for(UIView *view in [_scrollView subviews]) {
    NSMutableArray *_mutableArray = [_array mutableCopy];
    [_mutableArray filterUsingPredicate:[NSPredicate predicateWithFormat:@"guid like %@",view.object.guid]];
    if([_mutableArray count] != 0) {
        //object is already on screen we need to update it
        [view setObject:(Object*)[_mutableArray objectAtIndex:0]];
    }
    else {
        //object not on screen add it 
         _mutableArray = [_array mutableCopy];
        [_mutableArray filterUsingPredicate:[NSPredicate predicateWithFormat:@"guid not like %@",view.object.guid]];

        UIView *newView = [[UIView alloc] initWithObject:(Object*)[_mutableArray objectAtIndex:0]];
        [_scrollView addSubview:newView];

    }
}

如您所见,此方法会更新屏幕上的对象,如果对象不在屏幕上,则会创建该对象并将其添加到 scrollView 子视图层次结构中。现在我担心的是我在枚举它时修改了 scrollView 子视图层次结构。这最终会使我的应用程序崩溃吗?

如果是,如何修改上述代码以确保安全并实现相同的功能?

谢谢!

4

1 回答 1

0

这最终会使我的应用程序崩溃吗?

也许。在这种特殊情况下,答案是 UIScrollView 如何返回其子视图列表。如果它从它的子视图列表中创建一个副本或一个新数组并返回它,那么不,它不会崩溃。如果它返回相同的数组,它稍后会在您 addSubview: 时更新,那么您就是在玩火。

除非另有说明,否则更改您正在枚举的集合是一个坏主意。首先复制它并枚举它。

于 2012-02-09T22:44:11.153 回答