2012-01-13 61 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