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
答案 0 :(得分:8)
NSManagedObject不保留对其NSManagedObjectContext的强引用。我在测试项目上检查了一下。 因此,只要您使用其对象,就应该对NSManagedObjectContext保持强引用。
答案 1 :(得分:4)
当我写这篇文章时,我确实意味着它会保留对其相关NSManagedObjectContext
的引用。如果NSManagedObject
保留了NSManagedObjectContext
,则很可能会遇到问题。
在任何一种情况下,MO是否保留MOC与您的应用程序设计无关。如果您需要MOC留在那里,那么您需要保留它(现在称为强引用)或它将消失。框架内部的作用不是我们的问题。我们只需要确保平衡我们的保留和发布。
答案 2 :(得分:3)
马特,
我认为Marcus可能错误地认为NSManagedObject保留了它的上下文。每个NSManagedObject都维护一个指向上下文的链接。除非单个对象具有内部保留周期或保留在其上下文之外,否则,根据我的经验,它们在上下文发布时都被释放。如果他们保留了上下文,那几乎肯定不会是这种情况。
上面说过,你可以轻松编写代码来测试Marcus的说法。覆盖-dealloc并在调用时记录。
IMO,最好保留您的上下文,直到完成它为止。取决于未记录的行为可能不明智。
安德鲁