Core data NSManagedObject是否保留其NSManagedObject上下文?

Core data NSManagedObject是否保留其NSManagedObject上下文?,core-data,nsmanagedobject,retain,nsmanagedobjectcontext,Core Data,Nsmanagedobject,Retain,Nsmanagedobjectcontext,,但它是否保留了它 根据“NSManagedObject在内部保留对其NSManagedObject上下文的引用,我们可以访问它。” 扎拉怎么知道这一点,他是对的 我这样问是因为我想知道在下面的拆卸方法中是否将解除锁定。(我正在使用。) #导入 #进口 #导入“AccountUser.h” @接口AccountUserTests:SenTestCase{ AccountUser*AccountUser; } @结束 @实现AccountUserTests -(无效)设置{ accountUser

,但它是否保留了它

根据“NSManagedObject在内部保留对其
NSManagedObject上下文的引用,我们可以访问它。”

扎拉怎么知道这一点,他是对的

我这样问是因为我想知道在下面的
拆卸
方法中是否将
解除锁定
。(我正在使用。)

#导入
#进口
#导入“AccountUser.h”
@接口AccountUserTests:SenTestCase{
AccountUser*AccountUser;
}
@结束
@实现AccountUserTests
-(无效)设置{
accountUser=[accountUser insertIntoManagedObjectContext:
[NSManagedObjectContext contextWithStoreType:NSInMemoryStoreType错误:NULL]];
}
-(无效)拆卸{
[账户用户删除];
}
-(void)testFetchWithLinkedAccountUserID{
//测试在这里进行。。。
}
@结束
马特

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

如上所述,您可以轻松编写代码来测试Marcus的声明。Override-调用时解除锁定并记录

在我看来,最好的做法是在完成之前保留你的上下文。依靠未记录的行为可能是不明智的


Andrew

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

Wow,两年多,此处没有接受的答案:)

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


无论哪种情况,MO是否保留MOC都与应用程序设计无关。如果你需要主运行中心留下来,那么你需要保留它(现在称为强引用),否则它会消失。框架在内部做什么不是我们的问题。我们只需要确保保留和释放之间的平衡。

从引用的上下文来看,我想说,他很可能是指保留意义上的“保留”,而不是强烈引用意义上的“保留”。我也注意到了这一点。如果这是在某处记录的话会很好…@找不到Jeff Page更新到文档的链接:。不过,默认情况下,托管对象与其上下文之间的引用较弱。这意味着,通常情况下,您不能依靠上下文来确保托管对象实例的寿命,也不能依靠托管对象的存在来确保上下文的寿命重要的是托管对象如何传递,比如从一个视图控制器传递到另一个视图控制器。接收视图控制器应保留托管对象及其托管对象上下文。否则,托管对象的上下文可能会被释放,从而导致对象重置其属性并进入故障状态。只有在创建多个上下文时,这才是一个问题。在我们的应用程序中,例如,当我们想要显示编辑对象的视图控制器时,我们创建一个新的托管对象上下文,并传递该上下文。这样,如果用户取消,我们可以放弃上下文。在这种情况下,父控制器应该保留MOC。依靠内部控制是自找麻烦。如果你想保留它,就保留它。不要依赖框架。我完全同意明确保留上下文而不依赖框架。我的观点是,对于学习CoreData的人来说,这种模式(保留托管对象+其上下文)是令人惊讶和违反直觉的。如果你没有遵循这种模式,那么对象的状态就会神秘地消失。我认为这是一个个人偏好的问题,即哪个控制者保留上下文。我更喜欢后者,因为每个控制器都应该控制自己的环境,也因为苹果公司推荐它……CoreData文档说,“我倾向于不依赖文档来获得这种级别的建议。如果你想要一个只编辑一个MO的vc,并且它不需要MOC,那么为了简单起见,我将传递MO,因为我将从父vc控制父MOC。它肯定属于意见的范畴。至于那些令人惊讶的人,不应该。规则一直是保留你想保留的东西。当然,对于ARC来说,这正变得毫无意义。
#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