【问题标题】:Coredata | Child Context memory Management核心数据 |子上下文内存管理
【发布时间】:2012-10-18 22:41:33
【问题描述】:

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

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

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

那么其他一些类可以获取子上下文

NSManagedObjectContext *context = [coredata createChildContext];

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

【问题讨论】:

  • 我们需要了解更多才能提供合理的答案;例如,您使用 ARC 吗?您如何创建子上下文? memory management rules 对您的情况有何看法?
  • 我有一个 CoreData 类,它创建子上下文(该类是启用弧的类),但它可以为可能不是弧类的其他类提供上下文。 - (NSManagedObjectContext *) createChildContext { NSManagedObjectContext *childManagedContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; childManagedContext.parentContext = [自己的父上下文];返回子管理上下文;然后其他一些类可以获取子上下文 NSManagedObjectContext *context = [coredata createChildContext];

标签: ios core-data


【解决方案1】:

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

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

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

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

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

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

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

我强烈推荐阅读Advanced Memory Management Programming Guide;除了其他主题之外,它还有很多关于处理对象所有权的非常有用的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-15
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多