【问题标题】:Does an NSManagedObject retain its NSManagedObjectContext?NSManagedObject 是否保留其 NSManagedObjectContext?
【发布时间】:2011-12-04 20:44:11
【问题描述】:

NSManagedObject provides access to its NSManagedObjectContext,但它保留了吗?

根据"Passing Around a NSManagedObjectContext on iOS" by Marcus Zarra,“NSManagedObject 在内部保留了对其NSManagedObjectContext 的引用,我们可以访问它。”

Zarra 是如何知道这一点的,他是否正确?

我问是因为我想知道NSManagedObjectContext 是否会在下面的tearDown 方法中被dealloc'ed。 (我使用的是CocoaPlant。)

#import <SenTestingKit/SenTestingKit.h>
#import <CocoaPlant/CocoaPlant.h>

#import "AccountUser.h"

@interface AccountUserTests : SenTestCase {
    AccountUser *accountUser;
}
@end

@implementation AccountUserTests

- (void)setUp {
    accountUser = [AccountUser insertIntoManagedObjectContext:
                   [NSManagedObjectContext contextWithStoreType:NSInMemoryStoreType error:NULL]];
}

- (void)tearDown {
    [accountUser delete];
}

- (void)testFetchWithLinkedAccountUserID {    
    // Tests go here...
}

@end

【问题讨论】:

  • 从引用的上下文来看,我想说他的意思可能是保持意义上的“保留”,而不是强引用意义上的“保留”。

标签: core-data nsmanagedobject retain nsmanagedobjectcontext


【解决方案1】:

NSManagedObject 不持有对其 NSManagedObjectContext 的强引用。我已经在一个测试项目中检查过了。 因此,只要您使用它的对象,就应该保持对 NSManagedObjectContext 的强引用。

【讨论】:

  • 我也注意到了。如果这被记录在某处会很好......
  • 找不到@Jeff 页面
  • 更新了文档链接:Core Data Programming Guide, "Managed Objects and References" section。来自文档的引用“默认情况下,托管对象与其上下文之间的引用是弱的。这意味着通常您不能依赖上下文来确保托管对象实例的寿命,并且您不能依赖一个托管对象,以确保上下文的寿命。”
【解决方案2】:

哇,两岁多了,这里没有接受的答案:)

当我写那篇文章时,我确实是说它保留了对其关联的NSManagedObjectContext 的引用。如果NSManagedObject 保留了NSManagedObjectContext,那么它很可能会遇到问题。

在任何一种情况下,MO 是否保留 MOC 都与您的应用程序设计无关。如果您需要 MOC 保留,那么您需要保留它(现在称为强引用),否则它将消失。框架在内部做什么不是我们的问题。我们只需要确保平衡保留和释放。

【讨论】:

  • 重要的是托管对象如何传递,比如从一个视图控制器到另一个。接收视图控制器应保留托管对象其托管对象上下文。否则,它有可能释放托管对象的上下文,这会导致对象重置其属性并进入故障状态。如果您创建多个上下文,这只是一个问题。在我们的应用程序中,例如,当我们想要显示一个编辑对象的视图控制器时,我们创建一个新的托管对象上下文并传递它。这样,如果用户取消,我们可以丢弃上下文。
  • 在这种情况下,父控制器应该保留 MOC。依赖内部保留是自找麻烦。如果您想保留它,请保留它。不要依赖框架。
  • 我完全同意明确保留上下文而不依赖于框架。我的观点是这种模式(保留托管对象 + 它的上下文)对于学习 CoreData 的人来说是令人惊讶和违反直觉的——如果你不遵循这种模式,你的对象的状态就会神秘地消失。我认为哪个控制器保留上下文是个人喜好问题。我更喜欢后者,因为每个控制器都应该控制自己的环境,也因为 Apple 推荐它......
  • 我倾向于不依赖文档来获得该级别的建议。如果你想要一个只编辑一个 MO 并且不需要 MOC 的 vc,那么为了简单起见,我会传入 MO,因为无论如何我都会从父 VC 控制父 MOC。它绝对属于意见范围。至于保留令人惊讶的人,它不应该。规则一直是保留您想要保留的内容。当然,ARC 正在变得没有实际意义。
【解决方案3】:

马特,

我认为 Marcus 可能误写了 NSManagedObject 保留其上下文。每个 NSManagedObject 都维护一个到上下文的链接。除非单个对象具有内部保留周期或保留在其上下文之外,否则根据我的经验,它们都会在释放上下文时被释放。如果他们保留上下文,那么几乎肯定不会是这种情况。

如上所述,您可以轻松编写代码来测试 Marcus 的声明。覆盖 -dealloc 并在调用时记录。

IMO,在完成之前保留上下文是最佳做法。依赖于未记录的行为可能是不明智的。

安德鲁

【讨论】:

    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多