【问题标题】:How to empty properly an NSMutableArray如何正确清空 NSMutableArray
【发布时间】:2011-06-19 00:46:38
【问题描述】:

我正在尝试使用 [myarray removeallobjects]; 清空 NSMutableArray;但我收到错误 exc_bad_access。这是清空数组的正确方法吗?我试图将其设置为零,但它也不起作用。 实际上我正在做的是用数据填充数组,用户可以选择“刷新”数据,我想在输入刷新的数据之前清空数组。 因为太大,我不能发布任何代码。

【问题讨论】:

  • 您可以将要添加对象的部分添加到数组中吗?
  • [checkinArray addObject:checkinsA]; [checkinsA.taggedID 发布]; [checkinsA.taggedName 发布]; [签到发布];其中 checkinsA 是一个自定义对象。此命令也在循环中。

标签: iphone object nsmutablearray


【解决方案1】:

-[NSMutableArray removeAllObjects] 是清空NSMutableArray 的正确方法。您很可能会遇到崩溃,因为您仍在使用您在某处删除的对象,也许是在您的 UI 中。

【讨论】:

  • 或者对象添加到数组后过度释放。
【解决方案2】:

我认为问题出在您在 cmets 中提供的这个 sn-p 代码中,

[checkinArray addObject:checkinsA]; 
[checkinsA.taggedID release];
[checkinsA.taggedName release]; 
[checkinsA release]; 

taggedIDtaggedNamecheckinsA 对象的属性。它们应该只在dealloc 方法中发布。该数组不保留对象树。它仅保留根对象。所以这里不应该发布。所以把中间的两条线敲掉就可以了

[checkinArray addObject:checkinsA]; 
[checkinsA release]; 

【讨论】:

  • checkinsA.taggedID 和 taggedName 是 checkinsA 中的 NSMutableArrays。 checkinsA 也在一个 for 循环中。
  • for(NSDictionary *user in users) { Checkin *checkinsA = [[Checkin alloc] init]; checkinsA.taggedName =[[NSMutableArray alloc] init]; checkinsA.taggedID =[[NSMutableArray alloc] init]; ...... [checkinArray addObject:checkinsA]; [checkinsA.taggedID 发布]; [checkinsA.taggedName 发布]; [签到发布];
【解决方案3】:

您遇到了崩溃,因为您的数组不再存在于内存中。

我敢打赌是因为你忘记保留它(或发布得太早)

您可能使用[NSMutableArray array]arrayWithObjects: 或其中一些变体创建它,或者在alloc+init 之后调用autorelease,而如果它是一个实例变量,您应该保留它直到对象已解除分配。

请注意,内存管理是 iOS 开发的关键部分。一定要在更进一步之前完全了解它(比如它变得自然,你不会犹豫什么时候保留,什么时候释放),一旦你用对了,就可以避免很多这样的麻烦。

【讨论】:

  • @property (nonatomic, 保留) NSMutableArray *checkinArray;在我的.h。 checkinArray = [[NSMutableArray alloc] init];在 viewdidload 和 [checkinArray release] 中;在 dealloc 中(最后一个不是问题,因为即使我从 dealloc 中删除了这一行,它也会崩溃)。你看出什么不对了吗?
猜你喜欢
  • 2019-04-03
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多