2012-02-09 52 views
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子视图层次结构,同时枚举它。这会最终崩溃我的应用程序吗?这段代码是否会随机崩溃我的应用程序?

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

谢谢!

+0

你使用ARC吗?似乎你有一个与内存管理有关的问题 – NeverBe 2012-02-09 22:12:38

+0

我正在使用ARC。代码没有崩溃,但我不确定它不会在将来。这种添加子视图到scrollView(枚举它)的方式是一种有效的方式吗? – 2012-02-09 22:32:10

+0

你在_array存储什么? – NeverBe 2012-02-09 22:37:31

回答

0

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

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

除非另有说明,否则变异您正在枚举的集合是一个糟糕的主意。先制作一个副本,然后列举它。

+3

[UIView](https://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/cl/UIView)声明'@property(nonatomic ,只读,复制)NSArray * subviews' – 2012-02-09 22:47:07

+0

好点...然后枚举'subviews'不应该有任何不良影响。在使用AppKit/NSView这么长时间之后,我只是习惯于在变异之前进行复制。 – MyztikJenz 2012-02-09 22:50:22

+0

感谢你们两位,所以我在这种情况下是安全的。 – 2012-02-09 23:22:42