1

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

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

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

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

NSManagedObjectContext *context = [coredata createChildContext];

我的问题是我是否需要释放此类中的上下文,或者它是否会由创建它的 arc 类自动管理,因为我没有保留它。

4

1 回答 1

1

这实际上是一个非常有趣的问题,因为您将 ARC 和非 ARC 混合在一起。不过,与往常一样,内存管理策略可以帮助我们决定在这种情况下该怎么做。

首先(我想您已经知道了),您不必在创建它的 ARC 类中释放上下文(在内部-createChildContext)。实际上,您不能在那里显式释放或自动释放它,因为该类是 ARC - 您不能在其中进行任何手动内存管理。

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

为什么你没有获得上下文的所有权?好吧,正如您所写,您永远不会:

  • 显式保留对象(例如[[coredata createChildContext] retain]
  • 将对象分配给@property标记retainstrong
  • alloc从以、new或开头的方法获取对象copy

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

如果您出于某种原因需要更改它 - 例如,您需要子上下文保留一段时间,或者您打算在整个班级中使用它 - 您可以考虑上面列出的方法之一,您确实拥有所有权上下文。在这种情况下,您必须在完成后释放它。

我强烈建议阅读高级内存管理编程指南;除了其他主题外,它还有很多关于处理对象所有权的非常有用的内容。

于 2012-10-19T16:49:05.663 回答