0

viewDidLoad に次のコードがあります。

NSManagedObjectContext *moc=[[NSManagedObjectContext alloc]
                              initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setParentContext:[AppCoreDataHandler sharedManagedObjectContext]];
self.restroom=[NSEntityDescription insertNewObjectForEntityForName:@"Restroom"
                                            inManagedObjectContext:moc];
self.restroom.coordinate=[((AppDelegate *)[[UIApplication sharedApplication] delegate]) locationManager].location.coordinate;
self.review=[NSEntityDescription insertNewObjectForEntityForName:@"Review"
                                          inManagedObjectContext:moc];
[self.restroom addReviewsObject:self.review];

デバッグ コンソールを使用したテストでは、self.restroom.reviews がレビューを含む NSSet と等しいことが示されています。「viewWillAppear」に到達するまでに、self.restroom.reviews は nil です。コードのどこにもレビューを nil に設定していません。Self.review は常に完全に有効です。それは単に意味がありません!

私はこれを理解しようとして頭がいっぱいです。マルチスレッド コードにすることはできません。プロパティ/関係に他に何も割り当てていません。オブジェクトは弱く保持されておらず、それ自体を解放していません。ただ... 消えてしまいます。なんで?

編集:さらに楽しいことに、値がいつ変更されるかを確認するためにキー値監視を使用しました。

スタック トレースから読み取れることから、viewDidLoad 関数内で変更されています。しかし、コードをステップスルーすると、関数の終了後にキー値の通知が明確に送信されます。

4

1 に答える 1

1

まったくのばかげた運で (読んでください: うーん、どうしようかな... いや。それなら、どうだろうか... そして、約 20 億回の反復を繰り返します)、私はそれを理解しました。

これらのオブジェクト用に作成した子 MOC は、それへの最後の参照の後ではなく (ARC が行うと予想されることです)、関数の最後で割り当てが解除されます。そして、それが死んだら、割り当てられていたオブジェクトの割り当てを解除しませんでしたがそれらの関係を取り除きました。(NSSetがそれらを提供しているように見えますが、実際にはMOCの内部にあるものだったと思います)。

于 2012-12-14T03:02:14.827 に答える