我的OSX应用程序中有一个方法可以获取给定类型的所有元素(GEElementType
是一个枚举)。它在大多数情况下工作正常,但在某些情况下[NSManagedObjectContext executeFetchRequest:error:]
最终会多次调用[NSManagedObject initWithEntity:insertIntoManagedObjectContext:]
向MOC添加新对象......这是一个预期的行为吗?我可以一致地重现这一点,但我不明白它为什么会这样。
这是一段代码摘录:
+ (NSArray*)elementsOfType:(GEElementType)elementType
{
return [GEElement findAllObjectsWithPredicate:[NSPredicate predicateWithFormat:@"elemtype == %d", elementType]];
}
+ (NSArray*)findAllObjectsWithPredicate:(NSPredicate*)predicate
{
NSManagedObjectContext* context = [GEDataManager sharedInstance].managedObjectContext;
NSEntityDescription* entity = [self entityDescription];
NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setPredicate:predicate];
NSError* error = nil;
NSArray* result = [context executeFetchRequest:request error:&error];
if (error)
{
NSLog(@"%@", error.localizedDescription);
}
return result;
}
如果它有任何区别,我正在使用带有自定义基础NSManagedObject子类的Mogenerator。
我在子类'init中添加了一个断点,这里是堆栈跟踪:
#0 0x000000010003bf5a in -[GEElement initWithEntity:insertIntoManagedObjectContext:] at /.../DataModel/Human/GEElement.m:27
#1 0x00007fff89166abc in -[NSManagedObject(_NSInternalMethods) _initWithEntity:withID:withHandler:withContext:] ()
#2 0x00007fff8916540e in -[NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:optionalHandler:withInlineStorage:] ()
#3 0x00007fff891be7f6 in -[NSMappedObjectStore executeFetchRequest:withContext:] ()
#4 0x00007fff89154e63 in -[NSPersistentStoreCoordinator executeRequest:withContext:error:] ()
#5 0x00007fff89152c1b in -[NSManagedObjectContext executeFetchRequest:error:] ()
#6 0x000000010000e50c in +[GEDataModelBase findAllObjectsWithPredicate:] at /.../DataModel/GEDataModelBase.m:72
#7 0x00000001000c04da in +[GEElementTypes elementsOfType:] at /.../Helpers/GEElementTypes.m:75
...etc...
编辑:这是GEElement init方法,根据要求。第27行是第一行。
- (id)initWithEntity:(NSEntityDescription*)entity insertIntoManagedObjectContext:(NSManagedObjectContext*)context
{
self = [super initWithEntity:entity insertIntoManagedObjectContext:context];
if (self)
{
// ...A bunch of property initializations here...
}
return self;
}
如果有必要,我可以发布所有属性初始化,但那里没有任何花哨的东西。
答案 0 :(得分:0)
好的......所以我终于弄清楚我的应用程序上发生了什么导致了这个问题。
经过一番挖掘后,我发现在多次插入问题发生之前发生了另一个意外行为:我的一群GEElement
被释放但未被从MOC中删除。我不小心删除了一些对象,这些对象是唯一一个对它们有强烈引用的数组。所以我在创建MOC时添加了以下内容来解决我的问题:
managedObjectContext.retainsRegisteredObjects = YES;
显然,MOC没有保留对象并且它们已经被释放但是当我尝试运行查询时,它重新创建了丢失的对象......这是预期的行为吗?