2012-07-18 44 views
1

我有一個名爲imgBall的NSArray,它包含一個臨時變量名稱imgView,它在用戶觸摸屏幕上的一個點時在屏幕上顯示圖像。iOS:刪除由NSArray創建的UIImageView實例?

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(40, 40, 40, 40)]; 
    imgView.image = [UIImage imageNamed:@"ball.png"]; 
    [self.view addSubview:imgView]; 
    imgView.center = [myTouch locationInView:self.view]; 
    [imgBall addObject:imgView]; 
} 

用戶可以通過觸摸屏幕上的任何位置來創建多個實例。可能意味着陣列中有5個,10個或20個不同的球。

現在,我有一個按鈕,需要'清除'屏幕並刪除imgView的所有實例。 我曾嘗試以下:

for (UIImageView *imgView in imgBall) { 
    [self.view removeFromSuperview:imgView]; 
} 

for (UIImageView *imgView in imgBall) { 
    [imgBall removeObject:imgView]; 
} 

但他們都產SIGABRT並拋出異常:

Terminating app due to uncaught exception 'NSGenericException', reason: 
'*** Collection  <__NSArrayM: 0x735f4a0> was mutated while being enumerated.' 

我可以做到這一點有什麼辦法沒有得到SIGABRT每個拋出的時間?

回答

2

我想你想:

for (UIImageView *imgView in imgBall) { 
    [imgView removeFromSuperview]; 
    [imgBall removeObject:imgView]; 
} 

您還需要以後做[imgView發佈] [imgBall ADDOBJECT:imgView]當你在touchesEnded創建它,否則你會泄漏內存。

+0

哇哦,我簡直不敢相信我甚至沒有想到這一點。謝謝! – nworksdev 2012-07-18 19:17:18

+0

@nworksdev您也可以在刪除所有UIImageView後調用'[imgBall removeAllObjects]'。 – Anthony 2012-07-18 19:17:26

+0

明白了,我正想問這個。謝謝! – nworksdev 2012-07-18 19:20:05

1

這樣來做:

for (UIImageView *imgView in imgBall) 
{ 
[imgView removeFromSuperview]; 
} 

然後,別忘了釋放,並設置陣列imgBall至零,以避免內存問題。如果它是一個NSMutableArray,只需調用removeAllObjects。

+0

不要忘了接受答案,點擊複選標記= D來選擇你喜歡的答案,當然 – 2012-07-18 19:47:51

+1

我想你'''imgView removeFromSuperview];' – 2012-07-18 19:58:22

+0

更正了,謝謝! – 2012-07-18 20:17:00

1

你應該這樣做像...

for (UIImageView *imgView in imgBall) { 
    [imgView removeFromSuperview]; 
} 
[imgBall removeAllObjects];