gpt4 book ai didi

ios - 核心数据 |子上下文内存管理

转载 作者:行者123 更新时间:2023-11-29 13:26:38 24 4
gpt4 key购买 nike

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

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

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

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

NSManagedObjectContext *context = [coredata createChildContext];

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

最佳答案

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

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

现在让我们看看调用类。如您所写,您不必在完成后释放上下文。因为您还没有取得上下文的所有权,所以您不应该告诉对象您正在释放它;您不能放弃您最初从未拥有的对象的所有权。

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

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

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

如果您出于某种原因需要更改它 - 例如,您需要子上下文保留一段时间,或者您打算在整个类里面使用它 - 您可以考虑上面列出的方法之一,您 < em>do 掌握上下文。在这种情况下,您必须在完成后释放它。

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

关于ios - 核心数据 |子上下文内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12964877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com