1

我知道我一定在做一些愚蠢的事情,但一直无法弄清楚这一点。我有一些正在解析 xml 文件的代码。对象大多是 NSManagedObject 类型。
其中一个(InvoiceItem)有一个“类别”字段,它是对另一个 NSManagedObject 的引用。因此,在解析时,我会查找参考并进行分配。下一个 InvoiceItem 碰巧引用了相同的类别,并且一旦分配了该类别对象 - 上一个 InvoiceItem 中的引用被设置为 nil!

我不能包含所有代码,因为它有很多。这是相关的块:

  for (int i = 0; (i < invoice.invoiceItems.count); i++) {
     NSLog(@"InvoiceItemParser: didStartTag[A,%d]: ii = %ld, cat=%ld", i, (long) ((InvoiceItem *)[[invoice invoiceItems] objectAtIndex:i]), (long) ((InvoiceItem *)[[invoice invoiceItems] objectAtIndex:i]).category);
  }
  ii.category = (ChargeCategory *)[self.db getObjectOfType:@"ChargeCategory" withDBID:catid];
  NSLog(@"InvoiceItemParser: didStartTag[B]: ii=%ld, cat=%ld", (long) ii, (long) ii.category);
  for (int i = 0; (i < invoice.invoiceItems.count); i++) {
     NSLog(@"InvoiceItemParser: didStartTag[C,%d]: ii = %ld, cat=%ld", i, (long) ((InvoiceItem *)[[invoice invoiceItems] objectAtIndex:i]), (long) ((InvoiceItem *)[[invoice invoiceItems] objectAtIndex:i]).category);
  }

“self.db getObjectOfType”实际上只是在缓存映射中查找它,并从映射返回引用。

第一对对象的输出如下所示:

InvoiceItemParser: didStartTag[B]: ii=164718368, cat=361986368
InvoiceItemParser: didEndTag[B]: ii=164718368, cat=361986368
InvoiceItemParser: didEndTag[C]: ii=164718368, cat=361986368
InvoiceItemParser: didEndTag[D,0]: ii = 164718368, cat=361986368
InvoiceItemParser: didStartTag[A,0]: ii = 164718368, cat=361986368
InvoiceItemParser: didStartTag[B]: ii=361994624, cat=361986368
InvoiceItemParser: didStartTag[C,0]: ii = 164718368, cat=0

请注意,对象 164718368 上的类别在分配给对象 361994624 之前就存在,之后就消失了。

这总是以对任何有效类别对象的最后引用结束。运行中的所有先前引用都为零。

有任何想法吗?

4

1 回答 1

1

category 与 invoiceItems 的反向关系可能根本没有设置,或者是“一对一”关系。它必须是“to-many”,否则前面的项目会被归零。

于 2013-06-26T17:39:02.337 回答