2012-02-09 51 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