2012-01-13 60 views
0

我有一個NSMutableArray其中包含UIImageView對象添加到滾動視圖。更改nsmutable陣列的值而不會導致內存泄漏

[self.scrollView addSubview:UIImageView]; 
[self.array addObject:UIImageView]; 

我想刪除這些對象並在點擊按鈕後添加新對象。我試着通過在數組上調用removeAllObjects:來做到這一點,但它導致了崩潰。

for(int i=0;i<[self.array count];i++){ 
    [[self.array objectAtIndex:i] removeFromSuperview]; 
} 
[self.array removeAllObjects]; 
+0

請上傳您所使用的代碼,請。 – 2012-01-13 10:14:58

+0

我假設addSubView:UIImageView不完全是這樣的,你使用的是一個UIImageView的實例嗎?你到底在哪裏認爲有泄漏? – 2012-01-13 10:49:25

+0

這段代碼很好,因爲你已經提出了它。該錯誤必須在代碼中的其他地方。你需要發佈更多的周邊代碼,以便我們找到問題。這可能是因爲你是雙釋放項目,或者你意外地將你的數組初始化爲一個不可變數組而不是可變數組。你的代碼中是否有黃色警告? – 2012-01-13 12:38:31

回答

0

你好,請做以下類似代碼 -

UIScrollView *scrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 300, 400)]; 
[self.view addSubview:scrollView]; 

array=[[NSMutableArray alloc]init]; 

UIImageView *img1=[[UIImageView alloc]initWithFrame:CGRectMake(20, 0, 100, 100)]; 
UIImageView *img2=[[UIImageView alloc]initWithFrame:CGRectMake(20, 100, 100, 100)]; 
UIImageView *img3=[[UIImageView alloc]initWithFrame:CGRectMake(20, 200, 100, 100)]; 

[img1 setImage:[UIImage imageNamed:@"images.png"]]; 
[img2 setImage:[UIImage imageNamed:@"images.png"]]; 
[img3 setImage:[UIImage imageNamed:@"images.png"]]; 

[array addObject:img1]; 
[array addObject:img2]; 
[array addObject:img3]; 

for(int i=0;i<[array count];i++)  
    [scrollView addSubview:[array objectAtIndex:i]]; 

然後刪除所有視圖和空數組繼buttonTouchUpInside()的代碼 -

for(int i=0;i<[array count];i++){  
    [[array objectAtIndex:i] removeFromSuperview];  
    [array removeObjectAtIndex:i]; 
} 
+0

這將不起作用,因爲您在循環訪問時正在修改數組。如果您在逐步過程中刪除數組中的項目,則數組變得更短,因此在您嘗試從數組末尾刪除項目的時候到達最後。或者向後計數數組,或者每次刪除第0項。 – 2012-01-13 12:36:12

+0

@NickLockwood如果我刪除了removeallobjects代碼,那麼程序工作正常。我正在初始化數組並在一個函數中添加對象,該函數在viewdidload方法中調用。如果您需要任何特定數據,請回復。我嘗試使用removeObjectAtIndex並給出條件[數組數]> = 0,但發現該程序在第二個對象的刪除時崩潰。 – iOSD 2012-01-13 17:59:57

+0

@Dipak Chaudhari Nick說的是真的,從視圖中移除的代碼不會起作用,因爲在某些時候,i值在移除數組中的所有對象之前變得比數組數大。但我認爲情況改變可能會奏效。如果我們使用[數組數]> = 0,但它的功效對我來說。 – iOSD 2012-01-13 18:09:23