我正在从主要上下文创建一些子上下文,我想知道我是否需要释放子上下文?
我有一个创建子上下文的CoreData类(这个类是一个启用了弧的类),但是它可以为其他可能不是arc类的类提供上下文。
- (NSManagedObjectContext *) createChildContext
{
NSManagedObjectContext *childManagedContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
childManagedContext.parentContext = [self parentContext];
return childManagedContext;
}
然后其他一些类可以获得子上下文
NSManagedObjectContext *context = [coredata createChildContext];
我的问题是我需要在这个类中释放上下文,还是由创建它的arc类自动管理,因为我没有保留它。
答案 0 :(得分:1)
这实际上是一个非常有趣的问题,因为你正在混合ARC和非ARC。但与往常一样,Memory Management Policy可以帮助我们决定在这种情况下该做什么。
首先(我认为您已经知道),您不必在创建它的ARC类中释放上下文(在-createChildContext
内)。事实上,你不能在那里明确地释放或自动释放它,因为类是ARC - 你不能在其中进行任何手动内存管理。
现在让我们看一下调用类。正如您所写的那样,不必须在完成上下文后释放上下文。由于您尚未取得上下文的所有权,因此您不应告诉对象您正在发布它;它不是你放弃你从未拥有的对象的所有权的地方。
为什么你没有掌握上下文的所有权?好吧,正如你写的那样,你永远不会:
[[coredata createChildContext] retain]
)@property
标记为retain
或strong
alloc
,new
或copy
从这个意义上说,你可以认为对象是由创建它的ARC类“管理”的,尽管这有点误导;实际上,谁管理它并不重要,重要的是你不在非ARC呼叫类中拥有它。
如果你因某些原因需要改变它 - 比如说,你需要让孩子语境保持一段时间,或者你打算在整个班级中使用它 - 你可以考虑上面列出的方法之一,你在哪里< em> do 取得上下文的所有权。在这种情况下,你必须在完成后释放它。
我强烈建议阅读Advanced Memory Management Programming Guide;关于处理对象所有权以及其他主题,它有很多非常有用的东西。