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 ANYWHERE。Self.review 始终保持完全有效。这根本没有意义!

我在我的智慧尽头试图弄清楚这一点。它不能是任何多线程代码,我没有为属性/关系分配任何其他内容,对象没有弱保留并释放自身,它只是......消失了。为什么?

编辑:更有趣的是,我使用键值观察来检查值何时更改。

根据我对堆栈跟踪的了解,它正在 viewDidLoad 函数内部进行更改。但是当我单步执行代码时,在函数结束后会清楚地发送键值通知。

4

1 回答 1

1

纯属愚蠢的运气(阅读:hrm,我想知道是否......不。好吧。我想知道是否......并重复大约两个亿万次迭代),我想通了。

我为这些对象创建的子 MOC 不是在最后一次引用它之后被释放(这是我期望 ARC 做的),而是在函数结束时释放。当它死亡时,它并没有解除分配它分配给的对象,但它确实剥夺了它们的关系。(我猜想,虽然它看起来像 NSSet 提供了这些,但它实际上是 MOC 内部的东西)。

于 2012-12-14T03:02:14.827 回答