【问题标题】:Why am I getting a NSFastEnumerationMutationHandler with this NSMutableArray code?为什么我会使用此 NSMutableArray 代码获得 NSFastEnumerationMutationHandler ?
【发布时间】:2013-06-07 00:58:02
【问题描述】:

有人可以帮助我了解我在这里做错了什么会导致此堆栈跟踪:

1   libobjc.A.dylib                 0x3a8a897a objc_exception_throw + 26
2   CoreFoundation                  0x32b7fd80 __NSFastEnumerationMutationHandler + 124
3   CoreFoundation                  0x32adbcee -[NSArray containsObject:] + 134

代码如下:

NSMutableArray *leftoverArray = [[NSMutableArray alloc] initWithArray:itemsArray];
for (NSDictionary *tempItem in tempItemsArray)
{
      if (![itemsArray containsObject:tempItem])
      {
           [itemsArray addObject:tempItem];
      }
      else
      {
           [leftoverArray removeObject:tempItem];
      }
}
for (NSDictionary *item in leftoverArray)
{
      [itemsArray removeObject:item];
}
[mainController.tblView reloadData];

tempItemsArray 通过以下方式传递给这个类:

@property (nonatomic, strong) NSMutableArray *tempItemsArray;

我的应用中的其他地方确实有此代码:

if (appDelegate.loading)
    appDelegate.tempItemsArray = itemsArray;
else
    appDelegate.itemsArray = itemsArray;
[tblView reloadData];

谢谢!

【问题讨论】:

  • 添加exception breakpoint 看看哪一行代码抛出了异常
  • 您是如何创建tempItemsArray 的?它确实包含NSDictionary 对象吗?
  • 这是来自 Xcode 的崩溃报告,由于某种原因,我无法在我的机器上重现它。
  • 修改了我上面的代码以明确 tempItemsArray 的来源。
  • @EthanAllen 你确定tempItemsArray 不能作为itemsArray 的别名,可能是错误的吗?

标签: ios objective-c cocoa-touch nsmutablearray nsarray


【解决方案1】:

目前 tempItemsArray 和 itemsArray 是对同一个数组对象的引用。您在技术上同时循环和修改同一个数组。

尝试为 tempItemsArray 或 itemsArray 制作数组的副本:

if (appDelegate.loading)
    appDelegate.tempItemsArray = [NSMutableArray arrayWithArray:itemsArray];
else
    appDelegate.itemsArray = itemsArray;
[tblView reloadData];

【讨论】:

  • @EthanAllen 它应该是 mutableCopy 因为你的 tempItemsArray 被声明为 NSMutableArray。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多