【问题标题】:Changing the value of nsmutable array without causing memory leak更改 nsmutable 数组的值而不导致内存泄漏
【发布时间】:2012-01-13 10:09:38
【问题描述】:

我有一个NSMutableArray,其中包含添加到滚动视图的UIImageView 对象。

[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];

【问题讨论】:

  • 请张贴您正在使用的代码。
  • 我假设 addSubView:UIImageView 不完全一样,而您使用的是 UIImageView 的实例?您认为哪里有泄漏?
  • 这段代码很好,正如你所展示的那样。该错误必须在您的代码中的其他位置。您需要发布更多周围的代码,以便我们找到问题。可能是您正在双重释放项目,或者您可能不小心将数组初始化为不可变数组而不是可变数组。您的代码中是否有任何黄色警告?
  • @JamesWebster 是的,我正在使用 UIImageView 的实例。为了让观众了解我使用了 UIImageView。我觉得removeallobjects中有泄漏。当我将 removeallobjects 用于数组时,它会崩溃,但同时我有另一个具有相同行为的 mutablearray,并且可以在其上应用 removeallobjects。我不知道问题出在哪里。

标签: iphone memory-leaks nsmutablearray


【解决方案1】:

您好,请按照以下代码进行操作-

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 项。
  • @NickLockwood 如果我删除了 removeallobjects 代码,那么程序运行正常。我正在初始化数组并将对象添加到一个函数中,该函数在 viewdidload 方法中调用。如果您需要任何具体数据,请回复。我尝试使用 removeObjectAtIndex 并给出条件 [array count] >=0,但发现程序在删除第二个对象时崩溃。
  • @Dipak Chaudhari 尼克说的是真的,从视图中删除的代码将不起作用,因为在删除数组中的所有对象之前,i 值会变得大于数组计数。但我认为条件改变可能会奏效。如果我们使用 [array count] >= 0。但它对我来说不起作用。
  • @NickLockwood 请看我初始化数组的代码 NSMutableArray *array_temp = [[NSMutableArray alloc] init]; self.array=array_temp; [array_temp 发布]; array_temp = nil;
猜你喜欢
  • 2020-04-24
  • 2021-05-14
  • 2011-02-15
  • 2015-07-06
  • 2014-06-07
  • 2013-11-20
  • 2011-10-28
  • 2016-01-18
  • 2012-12-13
相关资源
最近更新 更多