Coredata |子上下文内存管理

时间:2012-10-18 22:41:34

标签: ios core-data

我正在从主要上下文创建一些子上下文,我想知道我是否需要释放子上下文?

我有一个创建子上下文的CoreData类(这个类是一个启用了弧的类),但是它可以为其他可能不是arc类的类提供上下文。

- (NSManagedObjectContext *) createChildContext
{
    NSManagedObjectContext *childManagedContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    childManagedContext.parentContext = [self parentContext];
    return childManagedContext;
}

然后其他一些类可以获得子上下文

NSManagedObjectContext *context = [coredata createChildContext];

我的问题是我需要在这个类中释放上下文,还是由创建它的arc类自动管理,因为我没有保留它。

1 个答案:

答案 0 :(得分:1)

这实际上是一个非常有趣的问题,因为你正在混合ARC和非ARC。但与往常一样,Memory Management Policy可以帮助我们决定在这种情况下该做什么。

首先(我认为您已经知道),您不必在创建它的ARC类中释放上下文(在-createChildContext内)。事实上,你不能在那里明确地释放或自动释放它,因为类是ARC - 你不能在其中进行任何手动内存管理。

现在让我们看一下调用类。正如您所写的那样,必须在完成上下文后释放上下文。由于您尚未取得上下文的所有权,因此您不应告诉对象您正在发布它;它不是你放弃你从未拥有的对象的所有权的地方。

为什么你没有掌握上下文的所有权?好吧,正如你写的那样,你永远不会:

  • 明确保留对象(例如[[coredata createChildContext] retain]
  • 将对象指定为@property标记为retainstrong
  • 从以allocnewcopy
  • 开头的方法获取对象

从这个意义上说,你可以认为对象是由创建它的ARC类“管理”的,尽管这有点误导;实际上,谁管理它并不重要,重要的是你不在非ARC呼叫类中拥有它。

如果你因某些原因需要改变它 - 比如说,你需要让孩子语境保持一段时间,或者你打算在整个班级中使用它 - 你可以考虑上面列出的方法之一,你在哪里< em> do 取得上下文的所有权。在这种情况下,你必须在完成后释放它。

我强烈建议阅读Advanced Memory Management Programming Guide;关于处理对象所有权以及其他主题,它有很多非常有用的东西。