私は何か愚かなことをしているに違いないことを知っていますが、これを理解することができませんでした. 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 です。
何か案は?