NSManagedObject是否保留其NSManagedObjectContext?

时间:2011-12-04 20:44:12

标签: core-data nsmanagedobject retain nsmanagedobjectcontext

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

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

Zarra如何知道这一点并且他是否正确?

我问,因为我想知道下面的NSManagedObjectContext方法中dealloc是否会tearDown。 (我正在使用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

3 个答案:

答案 0 :(得分:8)

NSManagedObject不保留对其NSManagedObjectContext的强引用。我在测试项目上检查了一下。 因此,只要您使用其对象,就应该对NSManagedObjectContext保持强引用。

答案 1 :(得分:4)

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

当我写这篇文章时,我确实意味着它会保留对其相关NSManagedObjectContext的引用。如果NSManagedObject保留了NSManagedObjectContext,则很可能会遇到问题。

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

答案 2 :(得分:3)

马特,

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

上面说过,你可以轻松编写代码来测试Marcus的说法。覆盖-dealloc并在调用时记录。

IMO,最好保留您的上下文,直到完成它为止。取决于未记录的行为可能不明智。

安德鲁