1

私は何か愚かなことをしているに違いないことを知っていますが、これを理解することができませんでした. xml ファイルを解析するコードがいくつかあります。オブジェクトはほとんど NSManagedObject 型です。
そのうちの 1 つ (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 への割り当ての直前にあり、直後になくなっていることに注意してください。

これは常に、有効なカテゴリ オブジェクトへの最後の参照だけで終わります。実行中の以前の参照はすべて nil'd out です。

何か案は?

4

1 に答える 1